ElasticSearch查询结果中如何让匹配度最高的item排在最前面

How to make the most match item to the top in ElasticSearch query result

我正在使用 ElasticSearch 构建电子商务搜索引擎,例如 nexttag.com or thefind.com

有些项目像:

  1. iPhone 6 Case - iPhone 6 Wallet Case , iPhone 6 Leather Case ,Flip Wallet Leather Case Cover with Credit Card Holder For Apple iPhone 6 4.7'' Black
  2. iPhone 6 / 6 Plus Quick Starter Guide: (For iPhone 4s, iPhone 5, iPhone 5s, and iPhone 5c, iPhone 6, iPhone 6+
  3. iPhone 6 Case, iPhone 6 (4.7) Flip Case [Hybrid Series] [Wallet] - Leather Case for iPhone 6 (4.7) - Kick Stand (PULPC-G-001)iPhone 6(4.7in) Brown
  4. Apple iPhone 6, Gold, 16 GB (Unlocked)

当我们查询"iPhone 6"时,如何让"Apple iPhone"在最前面,或者不是'iPhone case'或'iPhone quick guide'。

我建议你使用elasticsearch提供的功能分数查询功能。 function_score 允许您修改查询检索到的文档的分数。

简而言之,您所做的是通过使用您提供的自定义函数(或更多函数)修改每个文档的分数,对搜索结果添加一些 post 处理。

对于评分函数的实现,您有多种选择,您的选择应取决于您的具体情况。

例如,我可以向您推荐 field_value_factor 函数,该函数允许您使用文档中的字段来影响分数。这意味着您应该在文档中索引提升因子(例如,在每个文档中添加一个 "boost_factor" 字段,并将其值设置为 1.5(对于手机)和 1.0(对于手机壳或其他任何东西)。这样做的缺点是您将提升包含在实际数据中,并且将来的更改将需要重新索引数据。

在这种情况下,函数将是

field_value_factor": {
  "field": "boost_factor",
  "factor": 1.0,
  "modifier": "none"
}

这将转化为以下评分公式:

1.0 * doc['popularity'].value

有关详细信息,请在此处查看官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html#query-dsl-function-score-query