쿼리 나 필터를 사용해야하는시기 또는이 둘의 조합에 대한 설명을 볼 수 없습니다. 그들 사이의 차이점은 무엇입니까? 누구든지 설명해 주시겠습니까?
쿼리 나 필터를 사용해야하는시기 또는이 둘의 조합에 대한 설명을 볼 수 없습니다. 그들 사이의 차이점은 무엇입니까? 누구든지 설명해 주시겠습니까?
답변:
차이점은 간단합니다. 필터가 캐시되고 점수에 영향을 미치지 않으므로 쿼리보다 빠릅니다. 여기도 보세요 . 검색어는 일반적으로 사용자가 입력하고 예측할 수없는 내용이지만 필터는 사용자가 패싯을 사용하는 등 검색 결과를 좁히는 데 도움이됩니다.
공식 문서는 다음과 같습니다.
일반적으로 쿼리 대신 필터를 사용해야합니다.
- 이진 예 / 아니요 검색
- 정확한 값에 대한 쿼리
일반적으로 필터 대신 쿼리를 사용해야합니다.
- 전문 검색
- 결과는 관련성 점수에 따라 달라집니다
색인 myindex
에 세 개의 문서가 있다고 가정하십시오 .
curl -XPOST localhost:9200/myindex/mytype -d '{ "msg": "Hello world!" }'
curl -XPOST localhost:9200/myindex/mytype -d '{ "msg": "Hello world! I am Sam." }'
curl -XPOST localhost:9200/myindex/mytype -d '{ "msg": "Hi Stack Overflow!" }'
쿼리 : 문서가 쿼리와 얼마나 일치하는지
hello sam
(키워드 사용 must
)curl localhost:9200/myindex/_search?pretty -d '
{
"query": { "bool": { "must": { "match": { "msg": "hello sam" }}}}
}'
전자는 쿼리의 두 단어와 일치하기 때문에 문서 "Hello world! I am Sam."
에보다 높은 점수가 할당됩니다 "Hello world!"
. 문서가 채점됩니다.
"hits" : [
...
"_score" : 0.74487394,
"_source" : {
"name" : "Hello world! I am Sam."
}
...
"_score" : 0.22108285,
"_source" : {
"name" : "Hello world!"
}
...
필터 : 문서가 쿼리와 일치하는지 여부
hello sam
(키워드 사용 filter
)curl localhost:9200/myindex/_search?pretty -d '
{
"query": { "bool": { "filter": { "match": { "msg": "hello sam" }}}}
}'
중 하나를 포함하는 문서 hello
또는 sam
반환됩니다. 서류는 채점되지 않습니다 .
"hits" : [
...
"_score" : 0.0,
"_source" : {
"name" : "Hello world!"
}
...
"_score" : 0.0,
"_source" : {
"name" : "Hello world! I am Sam."
}
...
같은 것에 더 많은 추가. 필터가 먼저 적용된 다음 결과에 대해 쿼리가 처리됩니다. 문서 당 이진 true / false 일치를 저장하기 위해 bitSet Array라는 것이 사용됩니다. 이 BitSet 배열은 메모리에 있으며 두 번째로 필터를 쿼리 할 때 사용됩니다. 이런 식으로 비트 배열 데이터 구조를 사용하여 캐시 된 결과를 활용할 수 있습니다.
여기서 주목할 점은 요청이 실행될 때만 필터 캐시가 생성되므로 두 번째 적중에서만 실제로 캐싱의 이점을 얻는다는 것입니다.
그러나 따뜻한 API를 사용 하여 이것을 능가 할 수 있습니다 . warmer API에 대해 필터를 사용하여 쿼리를 등록하면 새로운 세그먼트가 생길 때마다 쿼리가 실행되도록합니다. 따라서 첫 실행 자체에서 일관된 속도를 얻습니다.
기본적으로 쿼리는 점수가 매겨진 문서를 검색 할 때 사용됩니다. 그리고 필터는 쿼리를 사용하여 얻은 결과 집합을 좁히는 데 사용됩니다. 필터가 부울입니다.
예를 들어, 조마 토와 같은 식당 인덱스가 있다고 가정하십시오. 이제 기본적으로 검색 키워드 인 'pizza' 를 제공하는 식당을 검색하려고 합니다.
따라서 query를 사용하여 "pizza"를 포함하는 모든 문서를 찾고 일부 결과를 얻습니다.
피자를 제공하고 atleast 4.0 등급을 가진 식당 목록을 원한다고 가정하십시오.
따라서 검색어에 키워드 "pizza" 를 사용하고 4.0으로 평가하는 필터를 적용하면됩니다.
필터가 일반적으로 색인을 쿼리하여 얻은 결과에 적용됩니다.
Filters
->이 문서가 일치합니까? 이진 예 또는 대답 없음
Queries
->이 문서가 일치합니까? 얼마나 잘 어울 립니까? 점수를 사용
Elasticsearch 버전 2부터는 필터와 쿼리가 병합되었으며 모든 쿼리 절을 필터 나 쿼리로 사용할 수 있습니다 (컨텍스트에 따라 다름). 버전 1과 마찬가지로 필터가 캐시되므로 스코어링이 중요하지 않은 경우 사용해야합니다.