You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Spring Boot的OpenSearch:按关键词匹配数量排序文档

纯OpenSearch解决方案:按匹配关键词数量降序排序

两种核心场景的实现方式

场景1:统计关键词的总出现次数(比如happy出现3次+cat出现2次=5次,按总和降序)

这种场景完全匹配你提到的需求——让含更多关键词出现次数的长文档排在前面。通过script_score直接在OpenSearch端计算每个文档中目标关键词的总出现次数,以此替代默认的BM25评分作为排序依据:

{
  "query": {
    "script_score": {
      "query": {
        "bool": {
          "should": [
            {"match_phrase": {"content": "happy"}}, // 用match_phrase确保匹配完整短语
            {"match_phrase": {"content": "cat"}}
          ],
          "minimum_should_match": 1 // 至少匹配一个关键词
        }
      },
      "script": {
        "source": """
          int totalCount = 0;
          String fieldValue = doc['content.keyword'].value.toLowerCase(); // 用keyword子字段获取完整文本,避免分词干扰
          for (String term : params.targetTerms) {
            String lowerTerm = term.toLowerCase();
            // 统计当前短语的出现次数
            int termCount = fieldValue.split(lowerTerm, -1).length - 1;
            totalCount += termCount;
          }
          return totalCount;
        """,
        "params": {
          "targetTerms": ["happy", "cat"] // 传入要统计的目标短语
        }
      }
    }
  },
  "sort": [
    {"_score": {"order": "desc"}} // 此时_score就是总出现次数,直接降序排序
  ]
}

关键注意点:需要确保你的目标字段(比如content)在索引映射中配置了keyword子字段,这样才能获取到未分词的原始文本,保证统计次数的准确性。

场景2:统计匹配的关键词种类数(只要文档包含happy算1,包含cat算1,总和降序)

如果你的需求是优先展示匹配更多不同关键词的文档(而非单关键词的重复出现次数),可以用function_score结合权重累加实现:

{
  "query": {
    "function_score": {
      "query": {
        "bool": {
          "should": [
            {"match_phrase": {"content": "happy"}},
            {"match_phrase": {"content": "cat"}}
          ],
          "minimum_should_match": 1
        }
      },
      "functions": [
        {
          "filter": {"match_phrase": {"content": "happy"}},
          "weight": 1 // 匹配该关键词加1分
        },
        {
          "filter": {"match_phrase": {"content": "cat"}},
          "weight": 1
        }
      ],
      "score_mode": "sum" // 所有匹配的关键词权重求和
    }
  },
  "sort": [
    {"_score": {"order": "desc"}}
  ]
}

性能优化建议

  • 优先使用keyword子字段统计,避免分词后的文本导致统计误差,同时脚本执行效率更高。
  • 若关键词数量较多,提前统一转成小写,避免在脚本中重复执行toLowerCase()。
  • 高频查询可将脚本保存为存储脚本(Stored Script),减少每次请求的脚本传输开销。

内容的提问来源于stack exchange,提问作者Maknaka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 08:57:20