Elasticsearch несколько предложений с более сложными случаями, такими как префикс соответствия в середине предложения - PullRequest
0 голосов
/ 07 ноября 2019

Мой вариант использования: у меня есть панель поиска, когда пользователь может ввести свой запрос. Я хочу показать пользователю несколько типов поисковых предложений в дополнение к обычному предложению запроса. Например, на скриншоте ниже, как вы можете видеть на этом скриншоте, вы можете видеть предложения компаний, компаний и школ.

enter image description here

В настоящее время это реализовано с использованием подсказок для завершения и следующих сопоставлений (это код из нашей реализации 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)

...