Elasticsearch

[elasticsearch] Query vs Filter Cache & Boolean query/filter 성능

'김용환' 2016. 1. 6. 21:48


Elasticsearch의 filter는 query보다 빠르다. filter에 cache를 적용하니 1000배 빨라지는 경우가 있었다. 메모리가 문제 없다면, 단순한 질의를 쓰는 것도 좋을 것 같다. 

참고 : http://knight76.tistory.com/entry/elasticsearch-Query-vs-Filter


query 방식 

curl -XGET http://es.google.com:9200/_search -d '

{

  "query": {

    "bool": {

      "must": [

        {

          "match_all": {}

        },

        {

          "term": {

            "user.id": "5681810"

          }

        }

      ]

    }

  }

}'



이는 filter로 변환하고, cache를 적용해서 빠른 처리가 가능하다. 테스트해보니. filter 처리시간이 query에 비해 1/10로 줄어든 것 같다. (엄청 빨라졌다.)


curl -XGET http://es.google.com:9200/_search -d '

{

  "query": {

    "filtered": { 

      "filter": {

      "term": {

       "user.id": "5681810",

       "_cache": "true"

 }   

      }

    }

  }

}'



필터 캐쉬(filter cache)는 필터 결과를 캐쉬한다.

아래 참조 문서에 따르면, indices.cache.filter.size (디폴트는 10%)만큼 캐쉬한다. 

indices.cache.filter.size는 퍼센트또는 크기로 캐쉬 크기를 결정할 수 있다. 




필터를 쓰고, 필터 캐쉬도 쓴다 해도 어떤 필터를 쓰느냐에 따라 성능 차이가 발생한다. 


Boolean 필터는 도큐먼트의 비트맵 결과를 비트 단위의 불린(Boolean) 연산으로 빠르게 실행할 수 있도록 최적화된 구현체여서 AND/OR/NOT 질의 그룹보다 빠르다.



내가 진행했던 테스트 방법은 curl과 time을 활용했고, 다음과 같다.


for i in {1..100}; do curl -s -w "%{time_namelookup} %{time_connect} %{time_appconnect} %{time_pretransfer} %{time_redirect} %{time_starttransfer} %{time_total}\n" -o /dev/null -XPOST 'http://es.google.com/_search?routing=123124&pretty' -d '

{

  "size": 50,

  "query": {

    "bool": {

      "must": [{

        "term": {

          "user.id": 123124

        }

      }, {

        "term": {

          "user.type": "develop"

        }

      }]

    }

  },

  "from": 0

}

'

; end




 for i in {1..100}; do curl -s -w "%{time_namelookup} %{time_connect} %{time_appconnect} %{time_pretransfer} %{time_redirect} %{time_starttransfer} %{time_total}\n" -o /dev/null -XPOST 'http://es.google.com/_search?routing=123124&pretty' -d '

{

  "size": 50,

  "query": {

    "filtered": {

      "filter": {

        "bool": {

          "must": [

            { "term": { "user.id": 123124 } },

            { "term": { "user.type": "develop" } }

          ]

        }

      },

      "_cache": true

    }

  },

  "from": 0

}

' ; done


테스트해봤을 때, Boolean filter가 Boolean query보다 100ms 정도  빨랐다.






참조 :

https://www.elastic.co/guide/en/elasticsearch/guide/current/filter-caching.html

https://www.elastic.co/guide/en/elasticsearch/reference/1.4/index-modules-cache.html#filter