2017-11-08 16 views
1

Elasticsearch에서 match_phrase_prefix 쿼리를 사용할 때 특히 쿼리가 한 단어 뒤에 하나의 문자 인 경우 예상되는 모든 결과가 반환되지 않는 문제가 있습니다. .Elasticsearch match phrase prefix가 모든 조건과 일치하지 않음

http://localhost:9200/test/drinks/_mapping 

반환 : 다른 기록의

{ 
    "test": { 
    "mappings": { 
     "drinks": { 
     "properties": { 
      "name": { 
      "type": "text" 
      } 
     } 
     } 
    } 
    } 
} 

와의 사이에

수백만이 있습니다

{ 
    "_index": "test", 
    "_type": "drinks", 
    "_id": "2", 
    "_score": 1, 
    "_source": { 
     "name": "Johnnie Walker Black Label" 
    } 
}, 
{ 
    "_index": "test", 
    "_type": "drinks", 
    "_id": "1", 
    "_score": 1, 
    "_source": { 
     "name": "Johnnie Walker Blue Label" 
    } 
} 

(이 중요한 데이터를 보호하기 위해 인위적인 예입니다)이 인덱스 매핑을 가지고

한 단어 뒤에 두 글자가 오는 다음 쿼리는

0입니다.개
POST http://localhost:9200/test/drinks/_search 
{ 
    "query": { 
     "match_phrase_prefix" : { 
      "name" : "Walker Bl" 
     } 
    } 
} 

반환이 :

POST http://localhost:9200/test/drinks/_search 
{ 
    "query": { 
     "match_phrase_prefix" : { 
      "name" : "Walker B" 
     } 
    } 
} 

결과를 반환하지 않습니다 : 한 단어와 하나 개의 문자로이 쿼리 반면

{ 
    "took": 1, 
    "timed_out": false, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 2, 
     "max_score": 0.5753642, 
     "hits": [ 
      { 
       "_index": "test", 
       "_type": "drinks", 
       "_id": "2", 
       "_score": 0.5753642, 
       "_source": { 
        "name": "Johnnie Walker Black Label" 
       } 
      }, 
      { 
       "_index": "test", 
       "_type": "drinks", 
       "_id": "1", 
       "_score": 0.5753642, 
       "_source": { 
        "name": "Johnnie Walker Blue Label" 
       } 
      } 
     ] 
    } 
} 

. 여기서 무슨 일이 일어날 수 있니?

답변

1

Elasticsearch 5.0 이상을 사용한다고 가정합니다. 나는 그것이 max_expansions 디폴트 값 때문에 있어야만한다고 생각한다.

문서 here에서 볼 수 있듯이 max_expansions 매개 변수는 마지막 용어를 확장 할 접두어의 수를 제어하는 ​​데 사용됩니다. 기본값은 50이며 두 개의 첫 번째 문자 B와 L이 "검정색"과 "파란색"을 발견하는 이유를 설명하지만 B는 그렇지 않습니다.

문서는 그것에 대해 매우 분명하다

match_phrase_prefix 쿼리는 가난한 사람의 자동 완성이다. 사용하기가 매우 쉽습니다. 검색 유형에 따라 빨리 시작할 수는 있지만 일반적으로 충분히 좋은 결과는 때로는 혼란 스러울 수 있습니다.

쿼리 문자열 quick brown f를 고려하십시오. 이 검색어는 빠른 및 갈색으로 문구 검색어를 생성하여 작동합니다 (즉, 빠른 용어가 있어야하며 용어 뒤에 갈색이 와야합니다). 그런 다음 정렬 된 용어 사전을보고 f로 시작하는 처음 50 개의 용어를 찾고 해당 용어를 구문 쿼리에 추가합니다.

문제는 첫 번째 50 개 용어가 여우라는 단어를 포함하지 않아서 빠른 여우가 발견되지 않을 수 있다는 것입니다. 사용자가 찾고자하는 단어가 계속 나타날 때까지 사용자가 계속 더 많은 글자를 입력하기 때문에 일반적으로 문제가되지 않습니다.

나는 결코 자신을 시도하지 않았기 때문에 좋은 공연을 찾고있다.

+0

한 가지 질문으로 설명서에는 "빠른"다음에 "갈색"이 표시 될 것이라고 나와 있습니다. 그런 다음 elasticsearch가 "f"로 시작하고 "빠른"및 "갈색"순서로 앞에 오는 50 개의 (기본적으로) 용어를 찾습니다. 아니면 "f"로 시작하는 용어일까요?그리고 이전의 경우에, 적어도 (이 질문에서) "b"("파란색"과 "검정")로 시작하는 용어가 2 개 이상있는 경우 결과를 반환하지 않습니다. 처음 50 개 용어를 볼 것으로 예상했습니다. 적어도 그 두 가지 또는 다른 것들이 보여 져야합니다. 아니면 내가 틀렸어. – Jose

+0

어쩌면 50 용어는 클러스터에서 사용하는 언어 (ES가 사용자 지정 언어를 지원하기 때문에)를 기반으로하는 사전에 내장 된 사전에서 나온 용어 일 뿐이고 색인에있는 다른 문서의 용어는 아닙니다. 이것은 왜 match_phrase_prefix querie에 대한 커스텀 매개 변수이고 "size"매개 변수를 사용하는 것과는 다른지를 설명합니다. – Rlarroque

+0

제 경우에는 어떤 필드도 매핑에 대한 언어 속성을 가지고 있지 않습니다. 그리고 곧 새 편지를 소개하면 결과가 더 정확하게 표시됩니다. mult_match 질의''type ":"phrase_prefix "를 사용하고 있기 때문에'max_expansions' 매개 변수를 사용할 수 없습니다. – Jose