【Elasticsearch】 Compound Queries

Elasticsearch Compound Queries

Elasticsearch 的 Compound Queries 是一种强大的工具,用于组合多个查询子句,以实现更复杂的搜索逻辑。这些查询子句可以是叶查询(Leaf Queries)或复合查询(Compound Queries),并且可以用于组合结果和分数、改变行为或从查询上下文切换到过滤上下文。

主要的复合查询类型

  1. bool 查询

    • 用于组合多个叶查询或复合查询子句,支持 mustshouldmust_notfilter 子句。mustshould 子句的分数会被合并,而 must_notfilter 子句在过滤上下文中执行。

    JSON复制

    复制代码
    GET /products/_search
    {
      "query": {
        "bool": {
          "must": [
            { "match": { "description": "wireless headphones" } }
          ],
          "filter": [
            { "term": { "brand": "BrandA" } }
          ],
          "should": [
            { "range": { "price": { "lte": 100 } } }
          ],
          "must_not": [
            { "term": { "color": "red" } }
          ]
        }
      }
    }
  2. boosting 查询

    • 返回匹配 positive 查询的文档,但会降低也匹配 negative 查询的文档的分数。

    JSON复制

    复制代码
    {
      "query": {
        "boosting": {
          "positive": { "match": { "content": "multiple queries" }},
          "negative": { "term": { "status": "archived" }},
          "negative_boost": 0.5
        }
      }
    }
  3. constant_score 查询

    • 包装另一个查询,但在过滤上下文中执行它。所有匹配的文档都将获得相同的"常量" _score
  4. dis_max 查询

    • 接受多个查询,并返回匹配任何查询子句的文档。与 bool 查询合并所有匹配查询的分数不同,dis_max 查询使用单个最佳匹配查询子句的分数。

    JSON复制

    复制代码
    {
      "query": {
        "dis_max": {
          "queries": [
            { "match": { "name": "kimchy" }},
            { "match": { "name": "elasticsearch" }}
          ],
          "boost": 1.2,
          "tie_breaker": 0.7
        }
      }
    }
  5. function_score 查询

    • 使用函数修改主查询返回的分数,考虑因素如流行度、最近性、距离或通过脚本实现的自定义算法。

    JSON复制

    复制代码
    {
      "query": {
        "function_score": {
          "query": { "match": { "name": "kimchy" }},
          "functions": [
            { "random_score": { "seed": 1234 }},
            { "exponential_decay": { "field": "age", "origin": 0, "scale": 1 }}
          ],
          "score_mode": "multiply"
        }
      }
    }

使用场景

  • 组合多个条件 :使用 bool 查询组合多个搜索条件,例如同时匹配多个字段。

  • 调整查询权重 :使用 boosting 查询调整某些文档的权重。

  • 固定分数 :使用 constant_score 查询为所有匹配文档分配固定分数。

  • 选择最佳匹配 :使用 dis_max 查询选择最佳匹配的查询子句。

  • 自定义评分 :使用 function_score 查询根据自定义逻辑调整文档分数。

通过合理使用这些复合查询,您可以构建更复杂、更灵活的搜索逻辑,以满足不同的业务需求。

相关推荐
Elastic 中国社区官方博客6 小时前
Elasticsearch:使用 Elastic Workflows 构建自动化
大数据·数据库·人工智能·elasticsearch·搜索引擎·自动化·全文检索
跨境卫士-小汪6 小时前
选品更稳的新打法:用“用户决策阻力”挑品——阻力越大,越有机会做出溢价
大数据·人工智能·产品运营·跨境电商·内容营销·跨境
迎仔6 小时前
11-NoSQL数据库HBase介绍:大数据世界的“快速检索图书馆”
大数据·nosql·hbase
迎仔6 小时前
01-Hadoop 核心三剑客通俗指南:从“单机搬砖”到“包工队”
大数据·hadoop·分布式
Elastic 中国社区官方博客7 小时前
Elastic 9.3:与数据对话、构建自定义 AI agents、实现全自动化
大数据·人工智能·elasticsearch·搜索引擎·ai·自动化·全文检索
双层吉士憨包7 小时前
乐天Rakuten开店:乐天Rakuten跨境店VS本土店?2026实战攻略
大数据
档案宝档案管理7 小时前
企业档案管理系统:从“资料存放”到“数据资产”的升级
大数据·人工智能·档案·档案管理
跨境卫士情报站7 小时前
用“渠道矩阵+内容节奏”把流量做成可控资产
大数据·人工智能·矩阵·产品运营·跨境电商·亚马逊
一只专注api接口开发的技术猿7 小时前
淘宝商品详情API的流量控制与熔断机制:保障系统稳定性的后端设计
大数据·数据结构·数据库·架构·node.js
EkihzniY8 小时前
涉外政务登记,精准识读保障合规办理
大数据·政务