MUST와 SHOULD 부울 쿼리의 탄력적 검색 차이


169

ES의 쿼리 MUSTSHOULDbool 쿼리 의 차이점은 무엇입니까 ?

나는 경우 그때 사용해야 내 용어를 포함하는 결과를 원하는 must?

특정 값만 포함 해야하는 쿼리가 있으며 오늘 시간 / 날짜보다 날짜 / 타임 스탬프가 낮은 결과는 없습니다-NOW

또한

아래 코드와 같이 must 안에 여러 필터를 사용할 수 있습니까?

"filtered": {
"filter": {
"bool" : {
        "must" : {
            "term" : { "type" : 1 }
            "term" : { "totals" : 14 }
            "term" : { "groupId" : 3 }
            "range" : {
                "expires" : {
                    "gte": "now"
                }
            }
        },

답변:


250

반드시 : 절 (쿼리)이 일치하는 문서에 나타나야합니다. 이 절은 논리 AND와 같이 일치해야합니다 .

다음을 의미해야합니다 . 논리 OR 과 같이이 절 중 하나 이상이 일치해야합니다 .

기본적으로 논리 연산자 AND 및 OR처럼 사용됩니다. 참조 .

이제 부울 쿼리에서 :

필수 사항 : 문서를 포함 하려면 일치 해야하는 절입니다 .

의미 해야 합니다.이 절이 일치하면 _score; 그렇지 않으면 효과가 없습니다. 각 문서의 관련성 점수를 세분화하는 데 사용됩니다.


must. 내부에 여러 필터를 사용할 수 있습니다 .


파티에 조금 늦었지만 must카테고리 또는 가격, should크기 및 색상과 같은 속성 에 대해서는 어떻 습니까. 이제 크기 L과 XL을 선택하면이 둘 사이의 필수 항목이지만 녹색도 선택해야하는 경우 (L 또는 XL 크기) AND (녹색)에 있어야합니다. 가능합니까?
Mave

이 경우 필터 는 속성에 대한 더 나은 접근 방법 일 수 있습니다. 검색 결과는 관련성있는 검색이 아닌 정확한 일치를 목표로합니다. 자세한 내용 은 문서의 쿼리 및 필터 를 참조하십시오 .
Jim K.

6
minimum_number_should_match = 1"이러한 조항 중 하나 이상이 일치해야한다"는 아이디어를 시행하기 위해 당신이 필요하다고 생각합니다 .
Jim K.

좋은 대답입니다! 나는 이것을 이해하는 데 매우 도움이되는 문서의 일부를 공유하고 싶습니다. elastic.co/guide/ko/elasticsearch/guide/current/…
ba0708

1
JimK-또는 필수 항목이 없습니다. must 절이 없으면 minimum_number_should_match가 암시됩니다.
LizH

15

이것은 인기있는 질문이므로 Elasticsearch 버전 2에서는 약간 변경되었음을 추가하고 싶습니다.

filtered쿼리 대신 bool최상위 수준에서 쿼리를 사용해야 합니다.

must부품 점수에 신경 쓰지 않으면 해당 부품을 filter핵심에 넣으십시오 . 점수 없음은 빠른 검색을 의미합니다. 또한 Elasticsearch는 캐시 여부 등을 자동으로 파악하여 must_not캐싱에도 동일하게 유효합니다.

참조 : https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html

또한 "gte": "now"밀리 초 단위로 인해 캐시 할 수 없습니다. must절 에서 두 개의 범위를 사용하십시오 . 하나는 now/1h다른 것과 함께 다른 하나 now는 작은 결과 세트에서 가속화되는 정확한 필터링을 위해 첫 번째는 잠시 동안 캐시 될 수 있습니다.


8

문서 에서 말했듯이 :

필수 : 절 (쿼리)이 일치하는 문서에 나타나야합니다.

해야 할 일 : 절 (쿼리)이 일치하는 문서에 나타나야합니다. must 절이없는 부울 쿼리에서 하나 이상의 should 절이 문서와 일치해야합니다. 최소 일치해야하는 절 수는 minimum_should_match 매개 변수를 사용하여 설정할 수 있습니다.

즉, 결과는 일치되어야 할 것이다 모든 쿼리가 존재 해야의 절 (또는 일치하는 적어도 하나해야 더이없는 경우 절을 해야의 절.

결과가 모든 쿼리를 만족 시키려면 must 을 사용해야 합니다 .


부울 쿼리 내에서 실제로 필터를 사용할 수 있습니다.


10
"당신은 반드시 사용해야합니다"보다는 "당신은 반드시 사용해야합니다"를 의미한다고 생각합니다 ;-)
jarmod
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.