文章

Elasticsearch中Bool 查询实际应用场景详解

下面我将详细解析这两个 Bool 查询的实际应用场景示例,帮助您更好地理解其组成部分和业务逻辑。

1. 电商产品搜索示例详解

GET /products/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "智能手机 高性能",
            "fields": ["name^3", "description"]
          }
        }
      ],
      "filter": [
        {
          "term": {
            "brand.keyword": "华为"
          }
        },
        {
          "range": {
            "price": {
              "gte": 2000,
              "lte": 6000
            }
          }
        },
        {
          "term": {
            "in_stock": true
          }
        }
      ],
      "should": [
        {
          "term": {
            "tags.keyword": "新款"
          }
        },
        {
          "term": {
            "tags.keyword": "热销"
          }
        }
      ]
    }
  }
}

业务场景解析

这是一个典型的电商网站产品搜索场景,用户在搜索框中输入"智能手机 高性能",并通过筛选条件选择了华为品牌、2000-6000元价格区间、只看有货商品。

查询组成部分详解

1. must 子句 - 核心搜索条件(影响相关性评分)

"must": [
  {
    "multi_match": {
      "query": "智能手机 高性能",
      "fields": ["name^3", "description"]
    }
  }
]
  • 功能:执行全文搜索,查找包含"智能手机"和"高性能"的产品

  • 字段:同时搜索 namedescription 两个文本字段

  • 权重name^3 表示产品名称字段的权重是描述字段的 3 倍

  • 业务意义:确保返回的结果与用户搜索词相关,优先考虑产品名称匹配的结果

2. filter 子句 - 精确筛选条件(不影响评分)

"filter": [
  {
    "term": {
      "brand.keyword": "华为"
    }
  },
  {
    "range": {
      "price": {
        "gte": 2000,
        "lte": 6000
      }
    }
  },
  {
    "term": {
      "in_stock": true
    }
  }
]
  • 品牌筛选brand.keyword: "华为" - 只返回华为品牌的产品

  • 价格范围price: {"gte": 2000, "lte": 6000} - 只返回价格在 2000-6000 元之间的产品

  • 库存状态in_stock: true - 只返回有库存的产品

  • 业务意义:这些是用户通过筛选项选择的硬性条件,必须精确匹配,不需要考虑相关性评分

3. should 子句 - 偏好条件(提高评分但不强制要求)

"should": [
  {
    "term": {
      "tags.keyword": "新款"
    }
  },
  {
    "term": {
      "tags.keyword": "热销"
    }
  }
]
  • 功能:提升带有"新款"或"热销"标签的产品排名

  • 业务意义:在满足必要条件的产品中,优先展示新上市或热销的产品,提高用户转化率

整体查询逻辑

这个查询的逻辑可以表述为:

查找名称或描述中包含"智能手机"和"高性能"的华为品牌产品,价格在 2000-6000 元之间且有库存,同时优先展示标记为"新款"或"热销"的产品。

2. 内容推荐系统示例详解

GET /articles/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "content": "人工智能 机器学习"
          }
        }
      ],
      "filter": [
        {
          "range": {
            "publish_date": {
              "gte": "now-30d"
            }
          }
        }
      ],
      "should": [
        {
          "term": {
            "author.keyword": "张三"
          }
        },
        {
          "terms": {
            "tags.keyword": ["AI", "深度学习", "神经网络"]
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "is_draft": true
          }
        }
      ]
    }
  }
}

业务场景解析

这是一个内容平台(如技术博客、新闻网站)的文章推荐场景,系统需要根据用户兴趣(人工智能和机器学习)推荐相关的最新文章。

查询组成部分详解

1. must 子句 - 核心内容匹配(影响相关性评分)

"must": [
  {
    "match": {
      "content": "人工智能 机器学习"
    }
  }
]
  • 功能:查找内容中包含"人工智能"和"机器学习"的文章

  • 业务意义:确保推荐的文章与用户的核心兴趣主题相关

2. filter 子句 - 时间限制(不影响评分)

"filter": [
  {
    "range": {
      "publish_date": {
        "gte": "now-30d"
      }
    }
  }
]
  • 功能:只返回最近 30 天发布的文章

  • 业务意义:确保推荐的是新鲜内容,避免向用户推荐过时的文章

3. should 子句 - 偏好提升(提高评分但不强制要求)

"should": [
  {
    "term": {
      "author.keyword": "张三"
    }
  },
  {
    "terms": {
      "tags.keyword": ["AI", "深度学习", "神经网络"]
    }
  }
]
  • 作者偏好:提升特定作者(张三)的文章排名

  • 相关标签:提升带有特定标签(AI、深度学习、神经网络)的文章排名

  • 业务意义

    • 可能是基于用户历史行为分析,用户更喜欢张三的文章

    • 或者这些标签与用户兴趣高度相关,能提供更精准的推荐

4. must_not 子句 - 排除条件

"must_not": [
  {
    "term": {
      "is_draft": true
    }
  }
]
  • 功能:排除草稿状态的文章

  • 业务意义:确保只推荐已发布的正式内容,避免向用户展示未完成的文章

整体查询逻辑

这个查询的逻辑可以表述为:

查找内容中包含"人工智能"和"机器学习"的最近 30 天发布的正式文章,同时优先推荐张三撰写的文章或带有 AI、深度学习、神经网络等标签的文章。

两个示例的共同特点与区别

共同特点

  1. 复合查询结构:都使用 Bool 查询组合多个条件

  2. 评分与过滤分离

    • mustshould 用于影响相关性评分

    • filtermust_not 用于精确过滤,不影响评分

  3. 业务逻辑清晰:查询结构反映了明确的业务需求和用户意图

主要区别

  1. 应用场景不同

    • 示例 1:电商产品搜索,偏重精确的属性筛选

    • 示例 2:内容推荐,偏重内容相关性和时效性

  2. 查询字段类型不同

    • 示例 1:混合了文本字段(name, description)和结构化字段(price, in_stock)

    • 示例 2:主要针对文本内容和时间字段

  3. 业务目标不同

    • 示例 1:帮助用户快速找到符合条件的商品,促进交易

    • 示例 2:向用户推荐感兴趣的内容,提高用户粘性

总结

这两个 Bool 查询示例展示了 Elasticsearch 在不同业务场景下的强大灵活性:

  1. 电商产品搜索:结合全文搜索与精确属性筛选,平衡相关性和精确匹配

  2. 内容推荐系统:结合内容相关性、时效性和用户偏好,提供个性化推荐

Bool 查询的优势在于能够将复杂的业务逻辑转化为结构化的查询条件,同时区分哪些条件影响相关性评分,哪些只是硬性过滤条件,从而实现既精确又灵活的搜索体验。

License:  CC BY 4.0