落_潇 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日

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装