[Executing Filters]
앞 섹션에서 document score (검색 결과의 _score 필드)에 대해서는 자세히 다루지 않고 넘어 갔었다. Score는 우리가 검색하고자 한 query와 document가 얼마나 match하는지를 측정한 숫자 값이다. Score가 높을수록 더 적합한 document이고, Score가 낮을수록 덜 적합한 document이다.
Elasticsearch의 모든 query는 적합성 score (점수)의 계산을 수행한다. 적합성 점수 (relevance score)가 불필요한 경우에 Elasticsearch는 query-dsl-filter, filter 형태의 또 다른 기능을 제공한다. Filter는 2가지 중요한 이유 때문에, 개념적으로 query를 더 빠르게 수행하도록 최적화 하는 것과 같다.
- Filter는 score 계산을 하지 않기 때문에 query보다 빠르다.
- Filter는 반복되는 검색 결과를 memory에 cache할 수 있기 때문에 query보다 빠르다.
Filter를 이해하기 위해서는, query와 filter를 조합한 filtered Query (http://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-filtered-query.html) 에 대해서 먼저 아는 것이 좋다.
예를 들어, range filter를 소개하자면, 값의 range에 따라 document를 filter할 수 있다. 일반적으로 숫자나 날짜별로 filter를 적용하여 사용한다.
다음 예제는 20000과 30000 사이의 balance를 가지는 모든 account를 리턴하는 filtered query를 사용한 것이다. 다른 말로 하자면, 20000 이상 30000 이하의 balance를 가진 account를 찾고 싶은 것이다.
curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
"query": {
"filtered": {
"query": {
"match_all": {} },
"filter": {
"range": {
"balance":
{
"gte":
20000,
"lte":
30000
}
}
}
}
}
}'
위 내용을 분석해 보면, filtered query는 query part인 match_all query와 filter part인 range filter를 포함하고 있다. 다른 query로 query part를 대체할 수 있고, 다른 filter로 filter part를 대체할 수 있다. 위의 경우에 range filter는 모든 document들이 range안에 동일하게 들어오기 때문에 완벽하다. 즉, 모든 document가 동일하다.
일반적으로 어떤 filter나 query를 원하는지 결정하는 가장 쉬운 방법은 relevance score (적합성 점수)를 신경 쓰는지 스스로에게 물어보는 것이다. Relevance score (적합성 점수)가 중요하지 않다면 filter를 사용하고, 중요하다면 query를 사용하라. SQL 배경지식이 있다면, query와 filter는 SELECT WHERE 절 개념과 유사하다. 비록 filter가 query보다 조금 더 유사하지만.
게다가, match_all, match, bool, filtered, range query 이외에도 다른 많은 이용할 수 있는 query/filter들이 있다. 여기서는 깊이 다루지 않을 것이다. 어떻게 동작하는지에 대한 기본적인 이해를 하고 있기 때문에, 다른 query/filter를 배우고 시험하면서 이런 지식을 활용하는데 어렵지는 않을 것이다.
댓글을 달아 주세요
댓글 RSS 주소 : http://www.yongbi.net/rss/comment/703