落_潇 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 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵