【问题标题】:Implementing search : Identifying known keywords实施搜索:识别已知关键字
【发布时间】:2016-04-11 23:55:38
【问题描述】:

我已经使用弹性搜索为我的电子商务网站实现了搜索功能。基本结构是这样的,每个产品都有一个标题,无论用户输入什么,我都使用弹性搜索确切的字符串并返回结果。

现在我注意到大多数搜索词组(几乎 90%)都遵循类似的模式。它包含:

  1. 产品的品牌名称(Apple、Nokia 等)
  2. 产品类别(手机、手机、智能手机等)
  3. 产品型号名称(iPhone 6S、Lumia 950 等)

现在我想如果我能够识别特定的组件,那么我可以返回比文本匹配更好的结果。

我有品牌、类别和型号的列表。如果我能够识别存在的术语,那么我可以专门使用该字段请求弹性搜索 比如“Apple iPhone 5S”的搜索字符串,我应该可以推断出那个brand=Apple。

编辑:在 cmets 中询问更多细节

文档结构:

我有一个索引,每个文档 ID 都是产品的 SKU,它包含以下字段

  1. 标题(苹果 iPhone 5S)
  2. 品牌(苹果)
  3. 类别(电子)
  4. sub_categ(智能手机)
  5. 型号(iPhone 5S)
  6. attribs(每个子类别特有的产品属性字典,例如 {"color": "gold", "memory": "32 GB", "battery": "1570 mAh"})
  7. 价格

用例:

现在当用户搜索短语“iphone 5s battery”时,elastic 会返回搜索结果,甚至返回手机。 (我同意电池的相关性得分更匹配)

我想要实现的是,我有子类别的主列表。因此,如果主列表中存在搜索短语中的任何单词,那么我将使用查询 ["must": {"sub_categ": "battery"}] 在 elasticsearch 上进行搜索。因此“智能手机”子类别的结果不会从弹性中获取。我希望在品牌、类别等多个领域复制这一点

我的问题是,如果品牌或主列表中的任何其他特定词出现在搜索词组中,我如何快速找到它?我能想到的唯一选择是遍历主列表并检查搜索短语中是否存在该单词。如果存在,请记下它并在所有主列表字段(品牌、类别、子类别)中执行相同操作。然后使用 must 生成查询,然后查询它们。我想知道是否有更好的方法来完成它。

【问题讨论】:

  • 你能分享你的映射吗?您还想为查询“Apple iPhone 5S”返回什么样的结果(文档)?
  • 你有什么问题?您可以标记您的字符串,并参考品牌/类别/型号索引。但这对面向关键字的搜索有何帮助?
  • @ChintanShah25 编辑了更多详细信息
  • @Sobrique 编辑了问题的更多细节

标签: search elasticsearch full-text-search


【解决方案1】:

Lucene 世界中在这个话题上发言最多的人是 Ted Sullivan。 (他称之为“自动过滤”,并拥有a component which does this available for Solr

我知道您正在使用 Elasticsearch,但 Ted 的组件通过内省 FieldCache 数据(由 Lucene 公开)来工作,因此应该可以使用 Elasticsearch 实现非常相似的东西(查看代码)。

this article 还讨论了如何创建一个单独的索引来提供您所描述的预查询智能(例如,您的术语“Apple”最常出现在 company 字段中)。

【讨论】:

  • 这正是我想要的。但是在搜索弹性查询自动过滤时,我没有找到任何类似的东西。我希望有人能够在弹性中复制这一点。谢谢
  • 是的。此时它是自定义功能。如果您不想针对 Lucene 进行编程,请尝试按照文章中的第二种方法(在该方法中保留带有“术语”和“出现字段 + 计数”的二级索引以进行预查询)
猜你喜欢
  • 1970-01-01
  • 2012-08-26
  • 2010-09-29
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
  • 2020-10-09
相关资源
最近更新 更多