ElasticSearch 实战:ElasticSearch文档多条件查询

Elasticsearch 实战:Elasticsearch 文档多条件查询

在实际应用中,常常需要根据多个条件对文档进行筛选。Elasticsearch 提供了多种查询类型和查询组合机制,支持构建复杂的多条件查询。以下是如何进行文档多条件查询的详细步骤:

**1. **布尔查询(Bool Query)

布尔查询是构建多条件查询最常用且最强大的工具。它允许将多个查询条件以 must(逻辑 AND)、should(逻辑 OR)、must_not(逻辑 NOT)的形式组合在一起。例如,查找标题包含 “Elasticsearch” 且价格小于 .png 的书籍,但不包含作者 “Zachary Tong”:

GET /my_index/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "title": "Elasticsearch" } },
        { "range": { "price": { "lt": .jpg } } }
      ],
      "must_not": [
        { "term": { "author": "Zachary Tong" } }
      ]
    }
  }
}

**2. **复合查询(Compound Queries)

除了布尔查询,Elasticsearch 还提供了其他复合查询类型,如 constant_score(为子查询赋予固定分数)、dis_max(返回子查询中得分最高的文档)、function_score(根据自定义函数计算分数)等。根据业务需求,可以选择合适的复合查询类型。

**3. **嵌套对象查询

对于包含嵌套对象的文档,可以使用嵌套查询(Nested Query)或父子关系查询(Parent-Child Query)来处理多条件查询。例如,一个文档结构包含多个评论(nested object),要查找包含特定用户评论且该评论点赞数大于 10 的文档:

GET /my_index/_search
{
  "query": {
    "nested": {
      "path": "comments",
      "query": {
        "bool": {
          "must": [
            { "term": { "comments.user": "user1" } },
            { "range": { "comments.likes": { "gt": 10 } } }
          ]
        }
      }
    }
  }
}

**4. **脚本查询(Script Query)

通过编写脚本,可以实现更复杂的条件判断。例如,查找价格低于平均价格的文档:

GET /my_index/_search
{
  "query": {
    "bool": {
      "filter": {
        "script": {
          "script": {
            "source": """
              double avgPrice = doc['price'].value;
              return avgPrice < params.targetPrice;
            """,
            "params": {
              "targetPrice": 50.0
            }
          }
        }
      }
    }
  }
}

**5. **查询模板(Query Template)

对于经常使用的多条件查询,可以预先定义查询模板,通过参数化查询来简化请求构造。查询模板使用 Mustache 语法,允许在运行时插入动态参数。例如,定义一个模板:

PUT _scripts/multi_condition_template
{
  "script": {
    "lang": "mustache",
    "source": """
      {
        "query": {
          "bool": {
            "must": [
              {{#title}}{ "match": { "title": "{{title}}" } },{{/title}}
              {{#price}}{ "range": { "price": { "gte": {{price}}, "lte": {{price_max}} } } },{{/price}}
              {{#author}}{ "term": { "author": "{{author}}" } }{{/author}}
            ]
          }
        }
      }
    """
  }
}

然后使用模板执行查询:

GET /my_index/_search/template
{
  "id": "multi_condition_template",
  "params": {
    "title": "Elasticsearch",
    "price": 50,
    "price_max": 100,
    "author": "Clintongormley"
  }
}

通过灵活运用布尔查询、复合查询、嵌套对象查询、脚本查询以及查询模板,您可以构建出满足复杂业务需求的多条件查询语句。在实际应用中,应结合数据模型和查询场景选择最适合的查询类型和参数,以实现高效准确的数据检索。同时,关注查询性能,适时进行查询优化。

相关推荐

  1. ElasticSearch 实战ElasticSearch文档条件查询

    2024-04-02 12:04:01       11 阅读
  2. elasticsearch条件查询

    2024-04-02 12:04:01       18 阅读
  3. Elasticsearch查询条件组合

    2024-04-02 12:04:01       43 阅读
  4. ElasticSearch 实战ElasticSearch文档聚合查询

    2024-04-02 12:04:01       17 阅读
  5. Elasticsearch 索引条件过滤:字段匹配

    2024-04-02 12:04:01       33 阅读
  6. elasticsearch查询

    2024-04-02 12:04:01       32 阅读
  7. Elasticsearch如何处理个关键字查询

    2024-04-02 12:04:01       17 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-02 12:04:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-02 12:04:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-02 12:04:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-02 12:04:01       18 阅读

热门阅读

  1. FIFO控制器设计——日常学习

    2024-04-02 12:04:01       10 阅读
  2. 关系型数据库与非关系型数据库、Redis数据库

    2024-04-02 12:04:01       17 阅读
  3. vue记事本渲染以及交互

    2024-04-02 12:04:01       15 阅读
  4. docker compose部署项目—踩坑记录

    2024-04-02 12:04:01       13 阅读
  5. Linux中的用户和组管理

    2024-04-02 12:04:01       12 阅读
  6. Go-Gin全局错误处理中间件

    2024-04-02 12:04:01       11 阅读
  7. C++ TCP 服务端和客户端通信的例子

    2024-04-02 12:04:01       12 阅读
  8. 前端 prefetch 和 preload 的区别?

    2024-04-02 12:04:01       14 阅读
  9. Yarn 包管理器入门指南

    2024-04-02 12:04:01       14 阅读
  10. linux定时调度任务

    2024-04-02 12:04:01       12 阅读
  11. Hadoop系列总结

    2024-04-02 12:04:01       16 阅读