ElasticSearch 复杂搜索例子:电商商品搜索、文档/文章检索

电商商品搜索模板

电商搜索的核心需求是:标题权重最高、支持模糊容错、短语匹配提升精准度。

设计思路

  • 权重分配:title(标题)权重最高(×5),brand(品牌)次之(×3),确保核心信息优先匹配。
  • 多策略组合:用 bool should 组合短语匹配(精准)、普通匹配(召回)、前缀匹配(联想),兼顾精准度和召回率。
  • 容错机制:开启 fuzziness: "AUTO" 允许输入错误(如“Mste60”匹配“Mate60”),prefix_length: 2 保证前2个字符精准,避免过度模糊。

代码

GET /products/_search
{
  "query": {
    "bool": {
      "should": [
        // 1. 短语匹配(高权重):提升精准短语的优先级
        {
          "multi_match": {
            "query": "华为 Mate60 Pro",
            "fields": ["title^5", "brand^3", "keywords^2"],
            "type": "phrase",
            "slop": 1,
            "boost": 3
          }
        },
        // 2. 普通匹配(中权重):保证召回率
        {
          "multi_match": {
            "query": "华为 Mate60 Pro",
            "fields": ["title^5", "brand^3", "description^2", "category"],
            "type": "best_fields",
            "operator": "AND",
            "fuzziness": "AUTO",
            "prefix_length": 2
          }
        },
        // 3. 前缀匹配(低权重):支持搜索框联想
        {
          "multi_match": {
            "query": "华为 Mate60 Pro",
            "fields": ["title^5", "brand^3"],
            "type": "phrase_prefix",
            "max_expansions": 10,
            "boost": 0.5
          }
        }
      ]
    }
  },
  "highlight": {
    "fields": {
      "title": {},
      "description": {}
    }
  }
}

文档/文章检索例子

文档检索的核心需求是:多字段互补匹配、支持跨字段短语、结果相关性优先。

设计思路

  • 类型选择:cross_fields 解决跨字段短语匹配(如“张三 作者”匹配 author:张三 + title:作者);most_fields 让匹配字段更多的文档得分更高(标题+摘要+标签都匹配的文档更相关)。
  • 过滤+排序:通过 bool must 添加基础过滤条件,排序时结合相关性得分和发布时间,保证结果时效性。

代码

GET /documents/_search
{
  "query": {
    "bool": {
      "must": [
        // 基础条件过滤(如时间、分类)
        {
          "range": {
            "publish_time": {
              "gte": "2023-01-01"
            }
          }
        }
      ],
      "should": [
        // 1. 跨字段短语匹配:适合人名、专有名词等跨字段场景
        {
          "multi_match": {
            "query": "机器学习实战 读书笔记",
            "fields": ["title^4", "author^2", "tags^3", "content"],
            "type": "cross_fields",
            "operator": "AND",
            "boost": 2
          }
        },
        // 2. 多字段互补匹配:匹配字段越多,得分越高
        {
          "multi_match": {
            "query": "机器学习实战 读书笔记",
            "fields": ["title^4", "abstract^3", "content", "tags^3"],
            "type": "most_fields",
            "boost": 1.5
          }
        }
      ]
    }
  },
  "sort": [
    // 按相关性得分+发布时间排序
    {"_score": {"order": "desc"}},
    {"publish_time": {"order": "desc"}}
  ]
}

通用优化建议

  1. 字段权重调整:根据业务数据特点调整 ^N 权重值(如视频平台可提升 video_title 权重,降低 description 权重)。
  2. 模糊匹配控制:对品牌、型号等核心字段,可设置 fuzziness: 0 关闭模糊;对长文本字段开启 AUTO 模糊。
  3. 性能优化:避免在 content 等超大字段上使用 phrase_prefix,可改用 edge_ngram 分词提前构建前缀索引。

总结

  1. 电商搜索:优先使用 phrase 类型保证精准度,结合 best_fields 保证召回,用 fuzziness 容错输入错误。
  2. 文档检索:用 cross_fields 处理跨字段短语,用 most_fields 提升多字段匹配的相关性,结合过滤和排序优化结果。
  3. 权重设计:核心字段(标题、品牌)设置更高权重,确保关键信息对排序的主导作用。

原文出处:/show_1GW2H25w59B6.html