2017-11-21 9 views
0

私はES5でオートコンプリート提案と共にマッチクエリを使用したい。基本的には、オートコンプリートのような属性に基づいてオートコンプリートの結果を制限したいのは、都市内でのみ結果を返さなければならないということです。Elasticsearch:オートコンプリートとともに一致クエリを使用する

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完了提案者を定義します。 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で説明します。

関連する問題