2017-11-21 1 views
0

ES5에서 자동 완성 제안과 함께 일치 검색어를 사용하고 싶습니다. 기본적으로 autocomplete는 도시 내에서만 결과를 반환해야하는 것처럼 속성을 기반으로 내 자동 완성 결과를 제한하려고합니다.탄성 검색 : 자동 완성과 함께 일치 검색어 사용

MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("cityName", city); 

SuggestBuilder suggestBuilder = new SuggestBuilder() 
        .addSuggestion("region", SuggestBuilders.completionSuggestion("region").text(text)); 

SearchResponse response = client.prepareSearch(index).setTypes(type) 
         .suggest(suggestBuilder) 
         .setQuery(queryBuilder) 
         .execute() 
         .actionGet(); 

위의 내용이 올바르게 작동하지 않는 것 같습니다. 나는 응답에서 두 결과를 서로 독립적으로 얻고있다.

의견이 있으십니까?

답변

0

제안 작성자가 완료 제안자를 만드는 것처럼 보입니다. 완료 제안자는 주 색인과 별도로 특수화 된 구조로 저장됩니다. 즉, cityName과 같은 필터 입력란에 액세스 할 수 없습니다. 제안 사항을 필터링하려면 제안을 작성할 때 명시 적으로 동일한 필터 값을 정의해야하며, 제안 사항이 첨부 된 문서에 대한 색인 작성 속성으로 분리하십시오. 이 suggester 필터는 컨텍스트라고합니다. 더 많은 정보를 찾을 수 있습니다 in the docs.

위에 링크 된 문서는 내가 할 수있는 것보다 더 잘 설명 할 것입니다. 그러나 여기에 간단한 예가 있습니다. 다음과 같이 매핑을 사용 :

"auto_suggest": { 
    "type": "completion", 
    "analyzer": "simple", 
    "contexts": [ 
     { 
      "name": "cityName", 
      "type": "category", 
      "path": "cityName" 
     } 
    ] 
} 

인덱스 설정이 절에서는 제안을 필터링하는 데 사용할 수있는 CityName이 컨텍스트와 auto_suggest라는 완료 SUGGESTER을 정의합니다. path 값이 설정됩니다. 즉,이 컨텍스트 필터는 주 인덱스의 cityName 특성에서 해당 값을 가져옵니다. 컨텍스트를 이미 주 색인에없는 컨텍스트로 명시 적으로 설정하려면 경로 값을 제거 할 수 있습니다. 작동해야 위의 설정으로, 조합이 뭔가를 컨텍스트를 제공하면서

제안을 요청하려면 다음이 요청도 흐릿한 부분에 대한 허용

"suggest": { 
    "auto_complete":{ 
     "text":"Silv", 
     "completion": { 
     "field" : "auto_suggest", 
     "size": 10, 
     "fuzzy" : { 
      "fuzziness" : 2 
     }, 
     "contexts": { 
      "cityName": [ "Los Angeles" ] 
     } 
     } 
    } 
    } 

주, 약간의 탄력 맞춤법 오류로 확인합니다. 또한 제안의 수를 10 개로 제한합니다.

ES 5.x의 완료 스 퀘지 터는 문서 중심이기 때문에 여러 문서가 동일한 제안을 가지고있는 경우 일치하는 경우 해당 제안의 중복을 받게됩니다 문자가 입력되었습니다. ES 6에는 제안을 중복 제거 할 수있는 옵션이 있지만 5.x에서는 이와 비슷한 것이 없습니다. 다시 말하지만 자신의 인덱스에 존재하는 수트 스터 (특히 FST)를 생각하는 것이 가장 좋습니다. 자세한 내용은 here입니다.

관련 문제