落_潇 2023-01-15 12:53 采纳率: 100%
浏览 42
已结题

关于#es#的问题,如何解决?(keyword类型,自定义权重排序)

elasticsearch 权重排序

现在有两个字段:名字和机构,因项目需要,使用的是keyword类型。
name,organizationName

现在设计需要,要按照** 检索词**匹配度进行排序。

姓名匹配字数/姓名总字数 x 80% + 机构匹配字数/机构总字数 x 20%

比如: 搜索词是 “张三”,
姓名:“张三的名字” (匹配到两个字,就是2,总字数5)
机构:“张三上海张三机构”,(匹配到四个字,就是4,总字数8)
则:2/5x0.8 + 4/8x0.2 这个结果就是这条的分数。

我想使用script painless实现,但是现在问题是es配置不支持正则,连基本的分割字符串split也不能使用。运维应该也不想开这个,影响效率。
想过能否使用java代码结合,但是script脚本中不支持 java代码工具类传参。

能否使用正常的脚本实现该功能?或者其他的解决方案?

  • 写回答

4条回答 默认 最新

  • 流比 2023-01-15 13:29
    关注

    使用 script_score 查询,这种方式查询出来的结果是经过脚本计算后得到的分数,然后再按照分数进行排序。

    GET index/_search
    {
      "query": {
        "function_score": {
          "query": {
            "match": {
              "name": "张三"
            }
          },
          "script_score": {
            "script": {
              "source": "double nameMatch = (doc['name'].value.length() - doc['name'].value.replace('张三','').length()) / doc['name'].value.length();double orgMatch = (doc['organizationName'].value.length() - doc['organizationName'].value.replace('张三','').length()) / doc['organizationName'].value.length(); return nameMatch * 0.8 + orgMatch * 0.2;"
            }
          }
        }
      }
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月15日
  • 已采纳回答 1月15日
  • 修改了问题 1月15日
  • 创建了问题 1月15日

悬赏问题

  • ¥15 在误装Windows server2019 后如何利用Windows.old恢复?
  • ¥20 代码实现状态连接包过滤防火墙的设计与实现
  • ¥15 vscode的红色箭头爆红和has no default export报错
  • ¥15 关于#sql#的问题:#情况描述 在用vs对项目进行调试时,出现找不到网络路径,然后查看SQL配置工具,发现SQL服务显示远程调用过程失败(相关搜索:防火墙)
  • ¥15 eNSP中基于默认路由及浮动路由的公司与分部互联和校园网综合项目
  • ¥15 主要进行描述泥浆在管路不同区段泥浆的密度不相同,泥浆的密度有高有低,此时管路的摩阻分布需要怎么计算,(标签-matlab)
  • ¥40 通过编制程序计算圆管内层流充分发展对流换热,参数如图5-4,以及公式5-16所示,要求用表5-6对程序计算准确性进行验证
  • ¥20 该学习哪个编程语言? AI会取代程序员吗?
  • ¥15 ensp如何拼通IP地址
  • ¥15 saber软件导入Ibis模型报错