2

我的用例:当用户可以输入他的查询时,我有一个搜索栏。除了常规查询建议外,我还想向用户显示多种类型的搜索建议。例如,在下面的屏幕截图中,正如您在此屏幕截图中看到的那样,您可以看到有公司部门、公司和学校的建议。

在此处输入图像描述

这目前是使用完成建议器和以下映射来实现的(这是我们的 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 实现来捕捉的场景

案例 1 - 句子中间的前缀匹配

# documents
[{ company_name: "Christian Dior Couture" }]
# => A search term "Dior" should return this document because it matches by prefix on the second word

案例 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 中使用建议器来实现这一点吗?还是我需要退回到使用文档中提到search的新search-as-you-type数据类型的多个?query

我在 AWS 和 Ruby 驱动程序 (gem elasticsearch-7.3.0)上使用 elasticsearch 7.1

4

0 回答 0