쿼리와 필터


198

쿼리 나 필터를 사용해야하는시기 또는이 둘의 조합에 대한 설명을 볼 수 없습니다. 그들 사이의 차이점은 무엇입니까? 누구든지 설명해 주시겠습니까?


46
공식 문서는 실제로 명확하지 않습니다
geekazoid


6
쿼리와 필터가 ES 2.0에서 병합 될 것이라는 점에 주목할 필요 가 있습니다 . 따라서 쿼리와 필터에 대해 말하고 작성된 대부분의 내용은 더 이상 적용되지 않습니다. 또한 이 변경 사항을 알리는 공식 블로그 게시물을 확인하십시오 .
Val

답변:


201

차이점은 간단합니다. 필터가 캐시되고 점수에 영향을 미치지 않으므로 쿼리보다 빠릅니다. 여기도 보세요 . 검색어는 일반적으로 사용자가 입력하고 예측할 수없는 내용이지만 필터는 사용자가 패싯을 사용하는 등 검색 결과를 좁히는 데 도움이됩니다.


19
사용자가 Google 유형 검색을 수행하는 경우 검색어를 사용합니까? 드롭 다운에서 가능한 값을 선택하는 경우 (예 : 송장 수> 50) 이것이 필터입니까?
Jonesie

4
네, 맞습니다. 일부 메트릭으로 전체 문서 세트를 제한해야 할 때마다 일반적으로 필터가 적합한 경우입니다. 나이, 길이, 크기 등으로 아마
Zach

내 솔루션은 동일한 요청에서 필터와 쿼리를 사용하며 테스트 데이터베이스에서 매우 빠릅니다. 우리는 곧 실제 데이터가 얼마나 빠른지 알아볼 것입니다.
Jonesie

@Zach 테넌트 내의 사용자에 대한 권한이있는 다중 테넌트 시스템에서는 테넌트 / 인증 정보가 모든 쿼리에 추가 된 필터 (예 : 필터링 된 쿼리) 인 것처럼 들립니다. 권리?
Scott Willeke

4
@activescott Yep, 그게 내가 할 것입니다. "사용자 별칭"이 항상 적절한 필터를 적용하도록 필터링 된 별칭을 설정할 수도 있습니다. 관리를 용이하게하고 쿼리를 업데이트하기 위해 코드를 변경하거나 쿼리를 추가로 처리하지 않아도됩니다.
Zach

99

공식 문서는 다음과 같습니다.

일반적으로 쿼리 대신 필터를 사용해야합니다.

  • 이진 예 / 아니요 검색
  • 정확한 값에 대한 쿼리

일반적으로 필터 대신 쿼리를 사용해야합니다.

  • 전문 검색
  • 결과는 관련성 점수에 따라 달라집니다

문서를 삭제하려면 가능한 경우 필터를 사용해야합니까? 나는 그것을 캐시하고 싶지 않다
Rytek

문서를 삭제할 때 점수가 필요하지 않으며 전체 텍스트 검색을 수행 할 필요도 없습니다. 따라서 삭제 / 삭제하지 않기로 결정하기 만하면됩니다. filter-query-context
nonNumericalFloat

13

예 (직접 시도하십시오)

색인 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."
     }
   ...

전체 텍스트 검색 또는 스코어링이 필요하지 않은 경우 성능을 높이기 위해 자주 사용하는 필터가 Elasticsearch에 의해 자동으로 캐시되므로 필터가 선호됩니다. Elasticsearch : 쿼리 및 필터 컨텍스트를 참조하십시오 .


11

같은 것에 더 많은 추가. 필터가 먼저 적용된 다음 결과에 대해 쿼리가 처리됩니다. 문서 당 이진 true / false 일치를 저장하기 위해 bitSet Array라는 것이 사용됩니다. 이 BitSet 배열은 메모리에 있으며 두 번째로 필터를 쿼리 할 때 사용됩니다. 이런 식으로 비트 배열 데이터 구조를 사용하여 캐시 된 결과를 활용할 수 있습니다.

여기서 주목할 점은 요청이 실행될 때만 필터 캐시가 생성되므로 두 번째 적중에서만 실제로 캐싱의 이점을 얻는다는 것입니다.

그러나 따뜻한 API를 사용 하여 이것을 능가 할 수 있습니다 . warmer API에 대해 필터를 사용하여 쿼리를 등록하면 새로운 세그먼트가 생길 때마다 쿼리가 실행되도록합니다. 따라서 첫 실행 자체에서 일관된 속도를 얻습니다.


1
흥미 롭습니다! 쿼리 전에 필터가 발생한다는 것을 알지 못했습니다. 필터 캐싱은 이제 더 의미가 있습니다.
Constant Meiring

항상 그런 것은 아닙니다. 필터링 된 점수 쿼리와 상수 점수 쿼리의 기본 및 기본 차이. 상수 점수는 항상 쿼리를 먼저 실행 한 다음 필터를 적용합니다. 필터링 된 쿼리에도 필터 전에 쿼리를 실행할 수있는 설정이 있습니다.
piyushGoyal

10

기본적으로 쿼리는 점수가 매겨진 문서를 검색 할 때 사용됩니다. 그리고 필터는 쿼리를 사용하여 얻은 결과 집합을 좁히는 데 사용됩니다. 필터가 부울입니다.

예를 들어, 조마 토와 같은 식당 인덱스가 있다고 가정하십시오. 이제 기본적으로 검색 키워드 인 'pizza' 를 제공하는 식당을 검색하려고 합니다.

따라서 query를 사용하여 "pizza"를 포함하는 모든 문서를 찾고 일부 결과를 얻습니다.

피자를 제공하고 atleast 4.0 등급을 가진 식당 목록을 원한다고 가정하십시오.

따라서 검색어에 키워드 "pizza" 를 사용하고 4.0으로 평가하는 필터를 적용하면됩니다.

필터가 일반적으로 색인을 쿼리하여 얻은 결과에 적용됩니다.


요청 본문의 예를 제공 할 수 있습니까?

9

Filters->이 문서가 일치합니까? 이진 예 또는 대답 없음

Queries->이 문서가 일치합니까? 얼마나 잘 어울 립니까? 점수를 사용


0

Elasticsearch 버전 2부터는 필터와 쿼리가 병합되었으며 모든 쿼리 절을 필터 나 쿼리로 사용할 수 있습니다 (컨텍스트에 따라 다름). 버전 1과 마찬가지로 필터가 캐시되므로 스코어링이 중요하지 않은 경우 사용해야합니다.

출처 : https://logz.io/blog/elasticsearch-queries/

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.