实施搜索:识别已知关键字

时间:2016-01-07 14:34:18

标签: search elasticsearch full-text-search

我使用弹性搜索为我的电子商务网站实现了搜索功能。基本结构就像每个产品都有一个标题和用户输入的内容我使用弹性搜索确切的字符串并返回结果。

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

  1. 产品的品牌名称(Apple,Nokia等)
  2. 产品类别(手机,手机,智能手机等)
  3. 产品型号名称(iPhone 6S,Lumia 950等)
  4. 现在我想如果我能够识别特定的组件,那么我可以返回比文本匹配更好的结果。

    我有品牌,类别和型号列表。如果我能够识别出现的条款,那么我可以专门请求具有该字段的elasticsearch 例如,搜索字符串“Apple iPhone 5S”,我应该能够推断该品牌= Apple。

    编辑:评论中提到的更多详情

    文件结构:

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

    1. 标题(Apple iPhone 5S)
    2. 品牌(Apple)
    3. categ(Electronics)
    4. sub_categ(智能手机)
    5. 型号(iPhone 5S)
    6. attribs(特定于每个sub_categ的产品属性字典,如{“color”:“gold”,“memory”:“32 GB”,“battery”:“1570 mAh”})
    7. 使用案例:

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

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

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

1 个答案:

答案 0 :(得分:1)

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

我意识到你正在使用Elasticsearch,但是Ted的组件通过内省FieldCache数据(由Lucene公开)来工作,所以应该可以实现与Elasticsearch非常相似的东西(查看代码)。

this article中还讨论了如何创建单独的索引以提供您所描述的查询前情报(例如,您的术语" Apple"最常见在company字段中。