私のユースケース: ユーザーがクエリを入力できるときに検索バーがあります。通常のクエリ候補に加えて、複数のタイプの検索候補をユーザーに表示したいと考えています。たとえば、下のスクリーンショットでは、このスクリーンショットでわかるように、会社のセクター、会社、および学校の提案があることがわかります。
これは現在、補完候補と次のマッピングを使用して実装されています (これは Ruby 実装のコードですが、簡単に理解できるはずです)。
{
_source: '',
suggest: {
text: query_from_the_user, # User query like "sec" to find "security" related matches
'school_names': {
completion: {
field: 'school_names_suggest',
},
},
'companies': {
completion: {
field: 'company_name.suggest',
},
},
'sectors': {
completion: {
field: sector_field_based_on_current_language(I18n.locale),
# uses 'company_sector.french.suggest' when the user browses in french
},
},
},
}
これが私のマッピングです(これはRubyで書かれていますが、これをElasticsearch JSON構成に精神的に変換するのはそれほど難しくないと思います
indexes :company_name, type: 'text' do
indexes :suggest, type: 'completion'
end
indexes :company_sector, type: 'object' do
indexes :french, type: 'text' do
indexes :suggest, type: 'completion'
end
indexes :english, type: 'text' do
indexes :suggest, type: 'completion'
end
end
indexes :school_names_suggest, type: 'completion'
# sample Indexed JSON
{
company_name: "Christian Dior Couture",
company_sector: {
english: 'Milk sector',
french: 'Secteur laitier'
},
school_names_suggest: ['Télécom ParisTech', 'Ecole Centrale Paris']
}
問題は、提案が十分に強力ではなく、文の途中に基づいてオートコンプリートできず、完全に一致した後でも追加の結果を提供できないことです. ES 実装でキャプチャする必要があるいくつかのシナリオを次に示します。
CASE 1 - 文中の接頭辞によるマッチング
# documents
[{ company_name: "Christian Dior Couture" }]
# => A search term "Dior" should return this document because it matches by prefix on the second word
CASE 2 - 完全一致でも結果を出す
# documents
[
{ company_name: "Crédit Agricole" },
{ company_name: "Crédit Agricole Pyrénées Gascogne" },
]
# => A search term "Crédit Agricole" should return both documents (using the current implementation it only returns "Crédit Agricole"
Elasticsearch でサジェスターを使用してこれを実装できますか? または、ドキュメントに記載されているように、 a を使用しsearch
て新しいsearch-as-you-type
データ型を利用する複数にフォールバックする必要がありますか?query
AWS で Elasticsearch 7.1 と Ruby ドライバー (gem elasticsearch-7.3.0
)を使用しています。