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

有没有精通 es 搜索的,可付费咨询

  •  1
     
  •   findlisa · 214 天前 via iPhone · 3175 次点击
    这是一个创建于 214 天前的主题,其中的信息可能已经有所发展或是发生改变。
    大概需求就是根据输入关键字,查询到数据后 返回相似度 区间在 0-1 区间。1 表示完全匹配,不太匹配的就降相似度
    25 条回复    2024-06-06 20:48:53 +08:00
    skyemin
        1
    skyemin  
       214 天前
    es 本身不是就有相关度 score 吗
    soundlife
        2
    soundlife  
       214 天前
    100 块,谢谢
    findlisa
        3
    findlisa  
    OP
       214 天前 via iPhone
    @soundlife 张小龙 d2VpamcyNzIy
    findlisa
        4
    findlisa  
    OP
       214 天前 via iPhone
    @skyemin 返回那个_score 是 0 到正无穷 而且也无法判断是不是完全匹配
    fkdog
        5
    fkdog  
       214 天前
    给你个思路,用向量搜索。
    然后你需要一套算法把文本向量化。
    tarasha
        6
    tarasha  
       214 天前   ❤️ 1
    可以试试 bge-m3 ,可以将文本转换为密集向量和稀疏向量()。
    然后密集向量在 es 中存储为 Dense_Vector ,稀疏向量用 Rank_Features 。
    最后 KnnQuery + RankFeatureQuery 混合检索,效果很好。
    findlisa
        7
    findlisa  
    OP
       214 天前 via iPhone
    @fkdog 向量了解过,需要将文本转向量,挺麻烦的
    ming159
        8
    ming159  
       214 天前
    ES 支持的搜索功能非常丰富. 但总的分为 2 类 query 与 filter
    query 是类似模糊匹配,也就是会有一个 _score .分值越高,说明匹配度越高.
    filter:是严格匹配. 匹配到数据时,得到的 结果只有 yes/no. 所以只要匹配到 一定是符合过滤条件的.
    你的需求应该是这样处理:
    1. 构造一个查询条件,同时使用 filter 和 query. 对同一个关键词进行查询. 在拿到结果后,再做处理.
    2. 分两次查询,先用 filter 查询,如果没有结果再用 query 查询一次.
    codegenerator
        10
    codegenerator  
       214 天前
    出价多少?
    视价格资深架构师可以应战
    akinoowari
        11
    akinoowari  
       214 天前
    @findlisa 第一次查询 filter 用 term 匹配一下字段.keyword ,然后加上 macth 查询,得到完全匹配的最高得分,第二次查询的时候计算一下就好,如果第一次没有拿到结果,说明没有完全匹配的,用 cosinesimilarity+1/2.x 得到最终相似度,x 的值看着给,反正不会得到 1 的结果就行
    strawberryBug
        12
    strawberryBug  
       214 天前 via Android
    给你个关键词 gauss decay function ,可以自定义 score
    findlisa
        13
    findlisa  
    OP
       214 天前 via iPhone
    @akinoowari 妙,感谢大佬这是个思路👍
    findlisa
        14
    findlisa  
    OP
       214 天前 via iPhone
    @strawberryBug ok 谢谢我去看看
    lemon1997
        15
    lemon1997  
       213 天前
    我做过一个简陋的,需要对文本分词,然后匹配命中数量,不过需要去掉一些无意义的词
    findlisa
        16
    findlisa  
    OP
       213 天前 via iPhone
    @lemon1997 能简单说下思路吗? 用关键字查询然后取分数最大的那一条做 文本相似度对比,然后拿来做分母吗
    findlisa
        17
    findlisa  
    OP
       213 天前 via iPhone
    @akinoowari 大佬,有点疑惑,第一次查询加上 match 的话应该都是会有数据的,如果第一次没数据,第二次应该也查不到数据
    akinoowari
        18
    akinoowari  
       211 天前
    @findlisa 是拿不到呀,所以是 2.x ,x>0 ,等于 0 的话就会有 1 的结果
    findlisa
        19
    findlisa  
    OP
       211 天前 via iPhone
    @akinoowari 那这样我第一次直接用 match 匹配,然后 返回的第一条拿到 highlight 字段后,拿来用 cosinsimilarity 和查询关键字比较,等于 1 就是完全匹配,第二次直接拿 score 做分母,小于 1 就用这个值算出相应的 maxscore= 0.x/_socre
    findlisa
        20
    findlisa  
    OP
       211 天前 via iPhone
    @codegenerator 可以加我聊详谈 d2VpamcyNzIy
    codegenerator
        21
    codegenerator  
       210 天前
    @findlisa 微信查不到,你这个什么帐号?
    findlisa
        22
    findlisa  
    OP
       210 天前 via iPhone
    @codegenerator 转下 base64
    teiboku1
        23
    teiboku1  
       170 天前
    你可以用语义搜索然后把分数自己归一化一下
    findlisa
        24
    findlisa  
    OP
       166 天前 via iPhone
    @teiboku1 先查一下 max 分数和 min 分数吗
    teiboku1
        25
    teiboku1  
       165 天前
    @findlisa 是的啊 你百度一下归一化 然后 max 和 0 区间归一化就行 但是语义搜索的话, 可能 1 代表完全匹配这个也可以你自己设定一个阈值 多少分算是 1
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5881 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 02:39 · PVG 10:39 · LAX 18:39 · JFK 21:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.