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


Posted by '김용환'

댓글을 달아 주세요

  1. Favicon of https://seungdols.tistory.com BlogIcon seungdols 2017.03.21 12:11 신고  댓글주소  수정/삭제  댓글쓰기

    궁금해서 그런데요.
    혹시 5.2 버전에서도 filtered를 쓸 수 있는지 궁금해서 여쭈어봅니다.
    레퍼런스 문서에서는 deprecated 되었다고 나와서요..