Bool Query
앞서 알아보았던 Query Context와 Filter Context로는 검색 조건을 맞추기가 불가능하다. 예를 들어 특정 시기 동안 발행된 특정 도서를 검색하기 위해서는 range 쿼리와 match 쿼리 두 가지가 함께 필요하기 때문이다.
Bool Query
두 가지 이상의 쿼리를 조합해서 사용할 수 있는 쿼리이다.
항목 | 설명 | 스코어링 | 캐싱 |
must | 항목 내 쿼리에 일치하는 문서를 검색 | O | X |
filter | 항목 내 쿼리에 일치하는 문서를 검색 | X | O |
should | 항목 내 쿼리에 일치하는 문서를 검색 | O | X |
must_not | 항목 내 쿼리에 일치하지 않는 문서를 검색 | X | O |
쿼리의 문서 일치/불일치 여부와 검색된 문서의 스코어 계산 여부, 캐싱 여부에 따라 항목이 나뉜다. 위 특징들을 기준으로 bool query의 must, should는 Query Context에서 실행되고, filter, must_not은 Filter Context에서 실행된다. 앞에서는 Query Context와 Filter Context를 개별적으로 사용했다면, bool query는 Query/Filter Context를 혼합해서 사용할 수 있다.
- bool query
Query Context인 match 쿼리를 must 절에 넣고 Filter Context인 range 쿼리를 filter 절에 넣었다. 물론 must절에서도 range를 사용할 수 있지만 따로 분류해서 각각의 절에 넣는 이유는 실행 속도가 더 빠르기 때문이다. Filter Context에 포함되는 쿼리들은 가급적 filter 절에 넣자. 먼저 must 절에서 match 쿼리로 South와 Korea 두개의 토큰을 생성하여 inverted index에서 동일 항목을 찾은 값들 중에서 filter 절에 있는 range를 통해 airport 필드에서 2000에서 3000사이의 값을 가진 문서를 검색하여 출력한다.
- must not
먼저 must절로 South라는 토큰이 포함된 문서를 검색하고 must_not 절로 검색된 문서들 중에서 Korea라는 토큰이 포함되지 않는 문서를 검색하여 출력하였다. 이와 같이 must_not 절은 사용자가 검색 쿼리를 통해 원치 않는 문서를 제외할 수 있는 항목이다. must_not 절은 filter 절과 마찬가지로 Filter Context에서 실행되어 마찬가지로 score 계산을 하지 않으며 문서 캐싱의 대상이 된다.
- should
match절로 country 필드에 South 토큰이 포함되는 문서를 찾는데 그 중에서 airport의 범위가 2000에서 3000까지의 문서를 검색한다. 그 중에서 should 절에 명시된 coutry필드가 Korea 토큰이 포함되어있고 airport 필드가 2361인 문서의 score값을 증가시켜 위 결과와같이 score가 증가한것을 볼 수 있다. should절을 사용하여 검색 상단에 노출되도록 할 수 있다. boost와 같은 기능이라고 생각하자.
위와 같이 minimum_should_match 옵션을 사용하면 should 절에 명시한 쿼리 중 적어도 하나는 일치해야 결과를 리턴하는 옵션이다.
참고문헌: 기초부터 다지는 ElasticSearch 운영 노하우