(ElasticSearch) filter와 query 그리고 filtered


* filtered query는 5.0버전부터 deprecated 되었습니다.



일반적으로 query는 일치하는 도큐먼트와 얼마나 근접한지 점수를 반환한다.
반면에 filter는 단순히 도큐먼트가 일치하는지 예, 아니오만 판단한다.


다음과 같다.

              텀 필터 :            tags=lucene 

  도큐먼트는 tags=lucene를 가지는가?


1 . Yes : 캐시 일치 - >도큐먼트 반환.
2. No : 캐시 불일치 -> 도큐먼트 제외



         텀 쿼리:
      tags=lucene 

  도큐먼트는 tags=lucene를 가지는가?


1. Yes : 점수 계산 -> 도큐먼트 반환
2. No : 다음 도큐먼트로 이동하므로 신경쓰지말자.


filtered : query + filter

필터드 쿼리는 쿼리와 필터 둘다 포함한다.
예는 다음과 같다.

GET get-together/_search
{
"query" : {
"filtered" : {
"query" : {
"match" : {
"title" : "hadoop"
}
},
"filter" : {
"term" : {
"host" : "andy"
}
}
}
}
}


GET get-together/_search
{
"query" : {
"bool" : {
"must" : {
"match" : {
"title" : "hadoop"
}
},
"filter" : {
"term" : {
"host" : "andy"
}
}
}
}

}


이 특정 필터 부분 내부에, host가 "andy"인 모든 도큐먼트를 찾기 위해 텀 필터가 사용되었다.
여기서 엘라스틱 서치는 이 필터와 일치하는 도큐먼트인지 아닌지 알려주는 바이너리 비트 집합인 비트셋(Bitset)을 작성한다.

엘라스틱 서치가 비트셋을 만들고 나서는 도큐먼트를 필터링하는데 사용할 수는 있으나 검색의 쿼리 일부분으로 검색하는 것은 아니다.

어떤 종류의 필터인가에 따라 엘라스틱 서치는 비트셋 결과를 캐시할 수 있다.
필터를 다른 검색에 사용해도 비트셋을 다시 계산할 필요 없다.

엘라스틱서치는 필터를 캐시해야 할지 말지를 수동으로 제공한다.

     

댓글

이 블로그의 인기 게시물

(네트워크)폴링방식 vs 롱 폴링방식

(ElasticSearch) 결과에서 순서 정렬

(18장) WebSocekt과 STOMP를 사용하여 메시징하기