当前位置: 首页 > news >正文

真实项目中使用到的ES自定义评分脚本

查询语句

POST /tm_index/_search
{
  "query": {
    "bool": {
      "filter": [
        { "match": { 
          "original": {
            "query": "你多少岁",
            "minimum_should_match": "69%"
          }
        }}
      ],
      "must": [
        { "function_score": {
          "functions": [
            {
              "filter": { "term": { "originalTag": "<1>1</1><2/><3>3</3>" } },
              "weight": 2 
            },
            {
              "script_score": {
              "script": { 
                "source": """
                    // 定义相似度计算函数(放于脚本顶部,str1是请求参数)
                    double calculate(String str, String str1) {
                        // 快速返回条件
                        if (str == null || str1 == null || str.isEmpty() || str1.isEmpty()) return 10.0;
                
                        int len = str.length(), len1 = str1.length();
                        int minLen = len < len1 ? len : len1;
                        int maxLen = len < len1 ? len1 : len;
                        double ratio = (double)minLen / maxLen;
                        if(ratio < 0.7) {
                            return 30;
                        }
                
                        String strLower = str.toLowerCase();
                        String str1Lower = str1.toLowerCase();
                
                        if(str.equals(str1)){
                            return 100;
                        }
                        if(strLower.equals(str1Lower)){
                            return 90;
                        }
                        // 预处理
                        char[] arr1 = strLower.toCharArray();
                        char[] arr2 = str1Lower.toCharArray();
                
                        // 动态规划数组
                        int[] dp = new int[len1 + 1];
                        for (int j = 0; j <= len1; j++) dp[j] = j;
                
                        for (int i = 1; i <= len; i++) {
                            int prevDiagonal = dp[0];
                            dp[0] = i;
                            char c1 = arr1[i-1];
                
                            for (int j = 1; j <= len1; j++) {
                                int cost = (c1 == arr2[j-1]) ? 0 : 1;
                                // 取最小值
                                int newVal = dp[j] + 1;
                                newVal = newVal < dp[j-1] + 1 ? newVal : dp[j-1] + 1;
                                newVal = newVal < prevDiagonal + cost ? newVal : prevDiagonal + cost;
                                prevDiagonal = dp[j];
                                dp[j] = newVal;
                            }
                        }
                        return 80.0 * (1.0 / dp[len1]);
                    }
                    String es2 = doc['original.keyword'].value;
                    String str2 = params.val2;
                    // 计算纯文本的评分
                    double textRatio = calculate(es2, str2);
                    return textRatio;
                """,
                "params": {
                  "val2": "你多少岁"
                }
              }
            }}
          ],
          "score_mode": "sum",
          "boost_mode": "replace"
        }}
      ]
    }
  }
}

自定义评分脚本

double calculate(String str, String str1) {
                        // 快速返回条件
                        if (str == null || str1 == null || str.isEmpty() || str1.isEmpty()) return 10.0;
                
                        int len = str.length(), len1 = str1.length();
                        int minLen = len < len1 ? len : len1;
                        int maxLen = len < len1 ? len1 : len;
                        double ratio = (double)minLen / maxLen;
                        if(ratio < 0.7) {
                            return 30;
                        }
                
                        String strLower = str.toLowerCase();
                        String str1Lower = str1.toLowerCase();
                
                        if(str.equals(str1)){
                            return 100;
                        }
                        if(strLower.equals(str1Lower)){
                            return 90;
                        }
                        // 预处理
                        char[] arr1 = strLower.toCharArray();
                        char[] arr2 = str1Lower.toCharArray();
                
                        // 动态规划数组
                        int[] dp = new int[len1 + 1];
                        for (int j = 0; j <= len1; j++) dp[j] = j;
                
                        for (int i = 1; i <= len; i++) {
                            int prevDiagonal = dp[0];
                            dp[0] = i;
                            char c1 = arr1[i-1];
                
                            for (int j = 1; j <= len1; j++) {
                                int cost = (c1 == arr2[j-1]) ? 0 : 1;
                                // 取最小值
                                int newVal = dp[j] + 1;
                                newVal = newVal < dp[j-1] + 1 ? newVal : dp[j-1] + 1;
                                newVal = newVal < prevDiagonal + cost ? newVal : prevDiagonal + cost;
                                prevDiagonal = dp[j];
                                dp[j] = newVal;
                            }
                        }
                        return 80.0 * (1.0 / dp[len1]);
                    }

根据纯文本和标签格式匹配语料。标签格式一致则加分。

加分逻辑如下:

{
   "filter": { "term": { "originalTag": "<1>1</1><2/><3>3</3>" } },
   "weight": 2 
}

相关文章:

  • GaussDB性能诊断核心武器:EXPLAIN ANALYZE 与执行计划
  • Git 使用教程
  • 敏捷开发之分支管理策略
  • Docker 学习(二)——基于Registry、Harbor搭建私有仓库
  • go数组的声明和初始化
  • Mysql命令大全(创建数据库显示数据库删除数据库)
  • PHP配置虚拟主机
  • 我们来学nginx -- 优化下游响应速度
  • Vue3 Suspense 终极指南:原理、用法与替代方案
  • 爬虫去重:数据采集时如何进行去重,及去重优化策略
  • 【Linux跬步积累】—— 线程池详解(有源代码)
  • 7.1 Hugging Face PEFT 快速入门:参数高效微调实战指南
  • tomcat的安装与配置(包含在idea中配置tomcat)
  • 20_simt_canonical
  • 依赖注入是什么?什么时候要用到依赖注入?为什么相较于使用@Resource或者@Autowired,spring官方更推荐使用构造函数进行依赖注入?
  • Day02-云服务器+小皮phpstudy一键部署建站
  • Pytorch实现之LSRGAN,轻量化SRGAN超分辨率SAR
  • setlocale()的参数,“zh_CN.UTF-8“, “chs“, “chinese-simplified“的差异。
  • postgresql
  • GaussDB自带诊断工具实战指南
  • 重温经典|开播20周年,仙剑的那些幕后你知道吗?
  • 上海证监局规范辖区私募经营运作,6月15日前完成自评自纠
  • 早期投资人蜂巧资本清仓泡泡玛特套现超22亿港元,称基金即将到期
  • 上海交大:关注到对教师邵某的网络举报,已成立专班开展调查
  • 湖南省邵阳市副市长仇珂静主动向组织交代问题,接受审查调查
  • 法治日报:商品明细是隐私,外卖员快递员不应知晓