출처 ㅣ http://guruble.com/elasticsearch-query-vs-filter/



Elasticsearch를 이용하여 원하는 결과를 얻어내는 방법은 크게 Query를 이용하는 방법과 Filter를 이용하는 방법 두 가지가 있습니다. 이 두가지는 비슷하면서도 달라서 어떤 상황에서 무엇을 이용해야 하는지 종종 혼란스러울 때가 있습니다. 특히, 처음 ‘검색’이라는 것을 접하게 된 경우에는 더욱 그렇습니다.

Elasticsearch에서 Query 와 Filter의 차이를 설명하는 가장 일반적인 내용은 아래와 같습니다.

  1. Query는 스코어 값에 영향을 미치고, Filter는 스코어 값에 영향을 미치지 않는다.
  2. Query는 캐싱되지 않고, Filter는 캐싱되므로 Filter가 성능면에서 유리하다.

한마디로 이야기하자면, 스코어 값이 필요할 경우에는 Query를 이용하고, 스코어 값이 필요하지 않은 경우에는 Filter를 이용하면 됩니다.

이 내용만으로도 Query와 Filter의 특징을 알 수 있지만, 당장 내가 이용해야 하는 것이 Query인지 Filter인지에 대한 답변으로는 부족할 때가 많습니다. 그래서 처음 Elasticsearch를 접하시는 분들을 위하여 상황에 따라 Query를 사용해야 하는지, Filter를 사용해야 하는지에 대해서 조금은 속 시원하게 정리해보도록 하겠습니다.

Filter :  RDBMS를 이용할 때 사용했던 WHERE 절 구문은 Elasticsearch의 Filter에 해당한다.

Query라는 용어는 Elasticsearch 뿐만 아니라, RDBMS를 이용할 때에도 공통적으로 사용되는 용어입니다. 그렇기 때문에 처음 Elasticsearch를 이용할 때 내가 원하는 결과를 추려내기 위해서 Query 문을 이용하는 경우가 많습니다. 하지만, 우리가 흔히 사용하였던 SQL query 에서의 WHERE 절에 해당하는 조건은 filter를 이용하는 것이 적합합니다. 왜냐하면, 전체결과에서 원하는 결과를 추려내는 작업(narrow down)이라는 점에서 개념이 동일하고, 성능면에서도 유리하며, 예상치 못한 결과를 얻게되는 일이 없기 때문입니다.

Query 검색 고유의 역할에 관련된 부분은 Query를 이용한다.

Elasticsearch에서 말하는 Query는 일반적인 SQL query의 개념과 다소 차이가 있습니다. 검색이라는 것은 단순히 ‘이러한 조건을 만족하는 레코드를 찾아라’라는 개념을 넘어서, ‘가장 적합하고 유사성(스코어)이 높은 결과를 찾아라‘라는 개념이 포함되기 때문입니다. 다시말해, 이미 tokenizing, analyzing 과정을 거쳐서 인덱싱 되어있는 데이터로 부터 검색 문자열에 해당하는 가장 유사성 높은 결과를 반환하는 것은 기존 SQL 문으로는 한계가 있었던 점이고, 이를 해결하기 위한 것이 바로 lucene과 같은 검색엔진을 기반으로 하는 오픈소스에서 Query에 해당하는 것입니다.


+ Recent posts