Мой вариант использования: у меня есть панель поиска, когда пользователь может ввести свой запрос. Я хочу показать пользователю несколько типов поисковых предложений в дополнение к обычному предложению запроса. Например, на скриншоте ниже, как вы можете видеть на этом скриншоте, вы можете видеть предложения компаний, компаний и школ.
В настоящее время это реализовано с использованием подсказок для завершения и следующих сопоставлений (это код из нашей реализации Ruby, но я полагаю, вы должны легко это понять)
{
_source: '',
suggest: {
text: filter(:term), # "sec"
'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 как, но я считаю, что не должно быть слишком сложно мысленно преобразовать это в конфигурацию JSON Elasticsearch
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
CASE2 - Обеспечить результаты даже после идеального совпадения
# 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? Или мне нужно использовать несколько search
, которые воспользуются преимуществами нового типа данных search-as-you-type
, используя query
, как упоминалось в документе ?
, который я используюasticsearch 7 на AWS и драйвер Ruby (gem elasticsearch-7.3.0
)