V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
sadfQED2
V2EX  ›  问与答

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

  •  
  •   sadfQED2 · 2022-05-10 11:41:02 +08:00 · 365 次点击
    这是一个创建于 710 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我们目前有一个列表搜索功能,使用的 es 实现搜索功能,但是无论怎么优化,始终跟竞品(携程、美团)比有差距

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

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

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

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

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

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

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

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

    我们最终的解决方案:

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

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

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

    最后个人总结:

    感觉 es 的设计是拿来做文章搜索的,对于名称这种搜索场景其实并不太合适。我们最终方案相当于仅仅是使用了 es 的倒排索引,而并没有用到 es 的分词功能
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5298 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 08:35 · PVG 16:35 · LAX 01:35 · JFK 04:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.