elasticsearch搜索提示

本篇博客纯属猜想,并未经过实践验证,仅仅提供一些思路和方法论。

什么叫”搜索提示’?你肯定见过。

无论中文还是英文,它都会按照前缀提示若干”搜索关键字”。

这里容易误解的是,搜索框并不是用你的输入去查找商品的名字并列举给你,而是会提示一些”关键字”,用这些”关键字”是可以搜索到相关联的商品的。

当然,提示的意义在于引导用户去使用这些标准的关键字,更容易搜到更多的内容。用户当然可以任性的继续按自己的输入去查询而不选择关键字,这就不属于”搜索提示”要讨论的范畴了。

那么这些提示的关键字是什么呢?一般是品牌,品类,标签这种信息,或者是一些更加特殊的组合信息,比如:”品牌 – 品类”,例如:Nike 运动服。

那么,当你输入一个搜索词的前缀时,提示的关键字里可能混合了”品牌”、”品类”、”标签”任意一种,因此建立这个”搜索提示词”索引库的数据结构也就大概略知一二了:

  • type:类型(品牌 or 品牌 or 标签 …)
  • content:内容(阅读器 or 月子服 …)

那么接下里的问题是这个搜索提示词有什么特点:

  • 中文,拼音,英文都可以搜索,模糊匹配能力很高。
    • 使用Multi-fields对content尝试进行多种分词方式并存,提高查询的命中率。
  • 前缀搜索,输入查询的词是列表里提示词的前缀:
    • 使用match_phrase_prefix支持前缀短语匹配,原理是查询输入被分词后,被匹配结果必须包含这些分词并且顺序一致,同时是被匹配结果的前缀。
  • 排序,可以对结果按默认相关性排序,或者按自定义相关性排序,或者按其他规则sort排序:
    • 使用function_score进行相关性自定义,比如:品类关键字比标签关键字相关性更高。
    • 使用sort排序,比如在建立”搜索提示词”索引时已经统计了关键字的重要性(比如关联的商品个数)。按照我的理解,sort排序是在内存完成的,所以不如相关性排序在检索过程中即可完成计算,并直接保留top N要来的快。
  • 纠错,用户难免输入有误,比如原本想搜索”爱马仕”,结果输入了”爱嘛仕”,这时候能正确提示结果就很贴心了。
    • 使用Phrase Suggester,也就是短语纠错。它会帮我们分词并与索引中的数据比对,从而实现对每个term进行纠错处理,最终保证整个短语的正确性。

最后

观察了一下各个搜索产品,貌似很多都是把查询整体作为一个term不分词进行查询,这要求”提示关键字”索引里的数据覆盖的更广,否则还是应该以phrase短语匹配进行。

另外,一旦敲击回车或者点击搜索,下一步的搜索就是直接基于商品的各种字段进行全文匹配了,与”搜索提示’就不是一码事了。

在搜索商品环节,主要了解到一个搜索推荐功能,也就是在query搜索不到足够商品的情况下,将query映射到其他相关的query,然后进一步搜索更多商品的方法。比如,用户搜索”小品”,但是你的网站并没有足够多的商品关联到”小品’,导致搜索结果很少,那么推荐的方法就是找到和”小品”近似的一些关键字,例如:”相声”,”舞台剧”,然后以这些term拼接后作为query,再重新进行一次商品的全文匹配,这样就实现了一些相关推荐效果,具体可以看看这个博客

综合来看,在最新版本的ES中可以先进行纠错,然后进行前缀搜索,应该可以达到一个比较好的提示效果。

相关阅读《基于Elasticsearch实现搜索建议

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~