V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Braisdom
V2EX  ›  程序员

请教一个问题,搜索词的生成应该怎么做。

  •  1
     
  •   Braisdom ·
    braisdom · 2022-10-21 10:06:05 +08:00 · 2078 次点击
    这是一个创建于 524 天前的主题,其中的信息可能已经有所发展或是发生改变。

    例如在 Google 中输入:Java

    google 会生成: javascript, java binary search, java 教程等一些列。

    这些生成算法应该使用哪些?

    29 条回复    2022-10-22 18:12:24 +08:00
    optional
        1
    optional  
       2022-10-21 10:08:36 +08:00 via iPhone
    ML 的经典场景
    Braisdom
        2
    Braisdom  
    OP
       2022-10-21 10:09:38 +08:00
    @optional 有具体的方法吗,目前只需要做到及格分就可以了。
    XJohn
        3
    XJohn  
       2022-10-21 10:15:13 +08:00
    一般都不是算法生成的。
    suggest 数据都会有以下一些来源:
    1. 搜索数据本身的一些 title 、tag 属性等
    2. 用户的搜索词(如用户可能会搜索 java ,还可能会搜索 javascript)
    3. 爬虫抓取
    Braisdom
        4
    Braisdom  
    OP
       2022-10-21 10:30:45 +08:00
    @XJohn 数据我有,我主要是做数据分析的搜索,关键词 都是预定义的,数据会比较多。
    realrojeralone
        5
    realrojeralone  
       2022-10-21 10:35:52 +08:00
    最简单的直接基于 Trie 做,query 的权重要加到 TrieNode 里,Trie 树里召回一堆词以后再加入一些提前处理好的非前缀词,比如和召回 query 强相关的中缀、后缀,最后排序
    Braisdom
        6
    Braisdom  
    OP
       2022-10-21 10:38:01 +08:00
    @realrojeralone 序列的权重怎么处理呢,例如:java orm 后面的词,单个词的权重容易计算,序列就比较麻烦了。
    optional
        7
    optional  
       2022-10-21 10:38:32 +08:00 via iPhone
    如果只是前缀匹配,那非常简单,像楼上说的 trie 树或者直接数据库前缀匹配都可以获得一些推荐,难的是怎么做权重和关联性
    wx006
        8
    wx006  
       2022-10-21 10:39:48 +08:00 via iPhone
    @Braisdom 处理好的数据写到 es 可以满足要求吗
    MindMindMax
        9
    MindMindMax  
       2022-10-21 10:42:37 +08:00
    其实,搜索运营人员也会参与进来
    Braisdom
        10
    Braisdom  
    OP
       2022-10-21 10:44:41 +08:00
    @wx006 ES 倒是一个不错的方法,检索起来也比较灵活,搜索效率也够用了。
    realrojeralone
        11
    realrojeralone  
       2022-10-21 10:44:52 +08:00
    @Braisdom 没有序列的概念,每个 suggestion 都是整体,比如 "javascript" / "java orm",在数据挖掘时 "java orm" 是从日志中挖掘出的用户 query ,如果很多人搜了 "java orm",这个 query 的权重就比较高。虽然在搜索时引擎内部会分词做召回,但是实际上用户想搜索的是个整体 "java orm",所以这个 query 就是个 suggestion ,不需要再分词单独计算权重。
    Braisdom
        12
    Braisdom  
    OP
       2022-10-21 10:46:35 +08:00
    我在做一个类似 ThoughtSpot 的项目,目前核心的 SQL 编译已经解决了,就差搜索提醒和 UI 了。
    realrojeralone
        13
    realrojeralone  
       2022-10-21 10:47:07 +08:00
    没有性能要求,对效果要求也不高,可以直接上 ES ,不然没必要自研,还是挺麻烦的
    Braisdom
        14
    Braisdom  
    OP
       2022-10-21 10:49:17 +08:00
    @realrojeralone 搜索日志,只能优化排序,原生的搜索词生成是基于系统的关键字检索出来的,系统在冷启动时,排序可以是随机的,随着使用情况,逐步优化。当然也可以初始化一些排序。
    shoumu
        15
    shoumu  
       2022-10-21 10:50:30 +08:00
    Braisdom
        16
    Braisdom  
    OP
       2022-10-21 10:51:24 +08:00
    @realrojeralone 最关键是能够持续学习,随着持续的使用,能够学习到用户的使用习惯。
    realrojeralone
        17
    realrojeralone  
       2022-10-21 11:06:02 +08:00
    @Braisdom 听起来不是搜索引擎类产品,那就可以先人工运维一版初始的 query 和权重,后续有了搜索日志以后再优化,或者考虑其他不用 Trie 的实现,完全用算法 比如 n-gram 生成 suggestion
    buyan3303
        18
    buyan3303  
       2022-10-21 11:12:08 +08:00
    不懂的人提一嘴 搜索关联展现这东西,好像是叫倒排索引。
    至于怎么展现 就是上面各位坛友说的了。
    Braisdom
        19
    Braisdom  
    OP
       2022-10-21 11:19:23 +08:00
    @realrojeralone 我想做的是根据用户输入的关键词编译成不同数据库的 SQL ,进行数据分析,和搜索引擎不太一样,但搜索提醒是用户体验的关键,这块做不好,后面再强大,也没啥用。
    fcten
        20
    fcten  
       2022-10-21 11:38:40 +08:00
    trie 树召回,召回之后再排序。没必要把召回和排序放到一起,不利于后续迭代优化。
    Braisdom
        21
    Braisdom  
    OP
       2022-10-21 12:04:50 +08:00
    发现一个项目: https://github.com/jermp/autocomplete

    正在尝试,应该会有帮助。
    v2exblog
        22
    v2exblog  
       2022-10-21 14:51:54 +08:00
    老哥你的搜索引擎已经快做完了吗?关注你好久了
    Braisdom
        23
    Braisdom  
    OP
       2022-10-21 14:58:14 +08:00
    还是搜索引擎,但返回的结果不一样了,今年年底前上线第一个版本。必须上线
    Braisdom
        24
    Braisdom  
    OP
       2022-10-21 15:02:50 +08:00
    目前,最复杂的 SQL 编译已经完美的解决了,在学习 React 写前端。
    LookLookBigDick
        25
    LookLookBigDick  
       2022-10-21 15:51:43 +08:00
    方案是怎么样的啊 能够说一下吗?
    Braisdom
        26
    Braisdom  
    OP
       2022-10-21 16:12:37 +08:00
    @LookLookBigDick 你是指什么方案,SQL 编译,还是搜索词提醒的方案?
    simonlu9
        27
    simonlu9  
       2022-10-22 00:10:06 +08:00
    elasticearch,的 suggest 可以根据上下文来推荐搜索推荐词,要定时更新对应的热度,不是一直不变的
    Braisdom
        28
    Braisdom  
    OP
       2022-10-22 09:15:27 +08:00
    @simonlu9 我准备用 ArrangoDB 做,就做前缀匹配,排序是综合排序,后面再用机器学习生成,

    https://github.com/jermp/autocomplete
    这个项目可以用,只要把搜索日志给他就可以了。
    LookLookBigDick
        29
    LookLookBigDick  
       2022-10-22 18:12:24 +08:00
    搜索词提醒方案,最终有确定有用方式去实现吗,我想虚心学习一下,因为自己没有思路。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3265 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 11:30 · PVG 19:30 · LAX 04:30 · JFK 07:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.