请问有做搜索的大佬吗,请问现在搜索是用什么技术呢?

2022-05-10 11:41:02 +08:00
 sadfQED2
我们目前有一个列表搜索功能,使用的 es 实现搜索功能,但是无论怎么优化,始终跟竞品(携程、美团)比有差距

主要差距在一下纠错、联想、排序方面

case1 、比如输入:"gugong"、"gug"、"故宫"、"顾工"、"故", 均出现故宫(我们目前是单独存了一些搜索关键词字,比如故宫会存:gugong 、gg 、gug 、顾工等,但是效果明显不如竞品)

case2 、 分词问题,比如有一个饭店叫“烟台国际饭店”,那么这个名字在 es 里面的分词是“烟台、国际、饭店” 用户如果输入“烟台国”,用户输入的分词结果为“烟台、国”,这个时候虽然能够搜索出这个饭店,但是排序靠后,反而出现了一个“烟台大酒店”在前面。我猜测 es 只找到了“烟台”这个词去计算排序分,“国”和“国际”不相等,因此没有参与排序分计算

case3 、还是“烟台国际饭店”,如果用户完整的输入“烟台国际饭店”,这个时候召回结果第一条就是他,但是还会有很多其他类似的结果,比如“烟台大饭店”也在结果内,虽说结果也能接受,但是能否在完全精确命中的情况下把多余的结果去掉呢?(尝试过"operator"设置成"and",但是这样会导致某些情况下搜不到数据)

所以前来请教一下,现目前做搜索推荐,除了 es 是否还有更好的技术方案呢?包含纠错、拼音缩写这种常见的业务场景

如果仅仅是我们对 es 调教不到位,可否推荐一些进阶的 es 搜索优化资料?

感谢你看完以上问题,小弟无以为报,磕头感谢 [狗头]
447 次点击
所在节点    问与答
4 条回复
sdot96
2022-05-20 16:26:16 +08:00
mark ,同样好奇怎么解决这些问题
sdot96
2022-05-30 15:30:42 +08:00
case1:能否说一下,具体比如什么东西他们是可以提示,但是你们没有提示的?
case2:这个可以通过 should + constant_score + boost + match_phrase/match_phrase_prefix 进行解决。
case3:这个我理解你可以把所有数据查询出来以后,再在业务代码里面做一遍过滤 ,只给前端返回完全匹配的结果。
sdot96
2022-05-30 15:39:45 +08:00
@sdot96

修改一下,个人理解,可以看看,欢迎大佬拍砖。
○ case1:这个我理解是你们也可以提示,但是只能提示一部分,比如一些特定的词语,比如故宫,北京,但是如果河南就不能了?如果是这样,我理解是不是可以配置 pinyin_analyzer 到你们搜索的对应字段上,可以解决你这个问题。
○ case2:这个我理解可以通过 should + constant_score + boost + match_phrase/match_phrase_prefix 进行解决。
○ case3: 这个我理解你可以把所有数据查询出来以后(查询的时候将完全匹配的数据进行 boost 放大),再在业务代码里面做一遍过滤(通过分数进行过滤) ,只给前端返回完全匹配的结果。
sadfQED2
2022-05-30 17:22:00 +08:00
@sdot96 #3 首先感谢回复哈

case1 主要问题是一些错字导致搜不到,比如“故宫”,用户输入了“股宫”,这样就搜不到了

我们最终的解决方案:

1 、由于我们业务场景,搜索的都是名字,并不是搜索描述文本,所以我们最终并没有使用 ik 之类的分词器进行分词,我们录入数据的时候,将名字直接拆成各种文字组合,比如“烟台国际饭店”,我们会录入“烟、烟台、烟台国、烟台国际、烟台国际饭、烟台国际饭店、台、台国、台国际、台国际饭...”,同时在这一步把所有中文也转成拼音和拼音缩写存进去。最终程序拆好词以后各个词空格隔开,存进 es ,es 里面使用空格分词

2 、基于第一步拆出来的字段,这个字段交给运营去维护,比如运营觉得搜索“顾宫”应该出现“故宫”,那么他只需要把“顾宫”加到故宫的搜索词里面即可

对于 Case3 ,我们这样自己拆词以后,搜索的时候将 es 的 operator 设置成 and 就没问题了

最后个人总结:

感觉 es 的设计是拿来做文章搜索的,对于名称这种搜索场景其实并不太合适。我们最终方案相当于仅仅是使用了 es 的倒排索引,而并没有用到 es 的分词功能

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/851933

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX