【发布时间】:2016-04-11 23:55:38
【问题描述】:
我已经使用弹性搜索为我的电子商务网站实现了搜索功能。基本结构是这样的,每个产品都有一个标题,无论用户输入什么,我都使用弹性搜索确切的字符串并返回结果。
现在我注意到大多数搜索词组(几乎 90%)都遵循类似的模式。它包含:
- 产品的品牌名称(Apple、Nokia 等)
- 产品类别(手机、手机、智能手机等)
- 产品型号名称(iPhone 6S、Lumia 950 等)
现在我想如果我能够识别特定的组件,那么我可以返回比文本匹配更好的结果。
我有品牌、类别和型号的列表。如果我能够识别存在的术语,那么我可以专门使用该字段请求弹性搜索 比如“Apple iPhone 5S”的搜索字符串,我应该可以推断出那个brand=Apple。
编辑:在 cmets 中询问更多细节
文档结构:
我有一个索引,每个文档 ID 都是产品的 SKU,它包含以下字段
- 标题(苹果 iPhone 5S)
- 品牌(苹果)
- 类别(电子)
- sub_categ(智能手机)
- 型号(iPhone 5S)
- attribs(每个子类别特有的产品属性字典,例如 {"color": "gold", "memory": "32 GB", "battery": "1570 mAh"})
- 价格
用例:
现在当用户搜索短语“iphone 5s battery”时,elastic 会返回搜索结果,甚至返回手机。 (我同意电池的相关性得分更匹配)
我想要实现的是,我有子类别的主列表。因此,如果主列表中存在搜索短语中的任何单词,那么我将使用查询 ["must": {"sub_categ": "battery"}] 在 elasticsearch 上进行搜索。因此“智能手机”子类别的结果不会从弹性中获取。我希望在品牌、类别等多个领域复制这一点
我的问题是,如果品牌或主列表中的任何其他特定词出现在搜索词组中,我如何快速找到它?我能想到的唯一选择是遍历主列表并检查搜索短语中是否存在该单词。如果存在,请记下它并在所有主列表字段(品牌、类别、子类别)中执行相同操作。然后使用 must 生成查询,然后查询它们。我想知道是否有更好的方法来完成它。
【问题讨论】:
-
你能分享你的映射吗?您还想为查询“Apple iPhone 5S”返回什么样的结果(文档)?
-
你有什么问题?您可以标记您的字符串,并参考品牌/类别/型号索引。但这对面向关键字的搜索有何帮助?
-
@ChintanShah25 编辑了更多详细信息
-
@Sobrique 编辑了问题的更多细节
标签: search elasticsearch full-text-search