首页 元宇宙

Elasticsearch 查询实战:从入门到精通,架构师带你玩转 ES 检索

分类:元宇宙
字数: (2489)
阅读: (9007)
内容摘要:Elasticsearch 查询实战:从入门到精通,架构师带你玩转 ES 检索,

在海量数据时代,如何快速、准确地检索信息成为关键。Elasticsearch(简称ES)作为一款强大的分布式搜索和分析引擎,被广泛应用于日志分析、电商搜索、安全分析等领域。本文将带你深入了解 Elasticsearch 数据库之查询操作,从基础概念入手,逐步掌握各种查询语法,并通过实战案例进行巩固,最终达到精通的水平。

Elasticsearch 查询基础

在开始深入各种查询语法之前,我们需要了解一些 Elasticsearch 的基本概念:

  • 索引(Index): 类似于关系型数据库中的数据库,是文档的集合。
  • 文档(Document): 类似于关系型数据库中的行,是可被索引的基本单位,以 JSON 格式存储。
  • 字段(Field): 类似于关系型数据库中的列,是文档中的一个属性。
  • 映射(Mapping): 定义了索引中字段的类型、索引方式等信息,类似于关系型数据库中的 Schema。

最基本的查询方式是使用 _search API。例如,要查询所有文档,可以执行以下请求:

GET /my_index/_search
{
  "query": {
    "match_all": {}
  }
}

常用查询语法详解

1. Match Query(匹配查询)

match 查询是一种全文检索查询,用于在文本字段中查找匹配的文档。

GET /my_index/_search
{
  "query": {
    "match": {
      "title": "Elasticsearch tutorial"
    }
  }
}

match 查询还支持多种参数,例如:analyzer(指定分析器)、fuzziness(模糊匹配)。在使用过程中要注意分词器的设置,特别是中文分词,常用的有IK分词器,需要根据业务场景进行选择,比如更注重召回率还是准确率。

2. Term Query(精确查询)

term 查询用于精确匹配字段的值。与 match 查询不同,term 查询不会对查询的文本进行分词。

Elasticsearch 查询实战:从入门到精通,架构师带你玩转 ES 检索
GET /my_index/_search
{
  "query": {
    "term": {
      "status": {
        "value": "published"
      }
    }
  }
}

需要注意的是,term 查询通常用于匹配非文本字段,例如数字、日期、布尔值或者keyword类型的字段。对text类型的字段进行term查询,查询不到结果的可能性很大,因为text类型的字段会分词,存储的是分词后的结果。

3. Range Query(范围查询)

range 查询用于查询落在指定范围内的文档。

GET /my_index/_search
{
  "query": {
    "range": {
      "age": {
        "gte": 20,  // 大于等于 20
        "lte": 30   // 小于等于 30
      }
    }
  }
}

range 查询支持 gt(大于)、lt(小于)、gte(大于等于)、lte(小于等于)等操作符。

4. Bool Query(布尔查询)

bool 查询允许组合多个查询条件,使用布尔逻辑(mustshouldmust_not)来控制查询的行为。

GET /my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "Elasticsearch"
          }
        }
      ],
      "should": [
        {
          "match": {
            "content": "search"
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "status": "draft"
          }
        }
      ]
    }
  }
}
  • must:文档必须匹配这些查询条件。
  • should:文档应该匹配这些查询条件,但不是必须的。如果没有 must 条件,则至少需要匹配一个 should 条件。
  • must_not:文档不能匹配这些查询条件。

5. Multi Match Query (多字段匹配查询)

multi_match 查询允许在一个或多个字段上执行相同的查询。

Elasticsearch 查询实战:从入门到精通,架构师带你玩转 ES 检索
GET /my_index/_search
{
  "query": {
    "multi_match": {
      "query": "Elasticsearch",
      "fields": ["title", "content"]
    }
  }
}

fields 参数指定要查询的字段列表。multi_match 查询也支持多种匹配类型,例如 best_fieldsmost_fieldscross_fields 等。

6. Prefix Query(前缀查询)

prefix 查询用于查找以指定前缀开头的文档。

GET /my_index/_search
{
  "query": {
    "prefix": {
      "title": {
        "value": "Elas"
      }
    }
  }
}

需要注意的是,prefix 查询的性能可能较低,特别是当索引中包含大量具有相同前缀的文档时。因此,应谨慎使用。

7. Wildcard Query(通配符查询)

wildcard 查询允许使用通配符(*?)进行模糊匹配。

GET /my_index/_search
{
  "query": {
    "wildcard": {
      "title": {
        "value": "Elas*ch"
      }
    }
  }
}

* 匹配零个或多个字符,? 匹配单个字符。与 prefix 查询类似,wildcard 查询的性能也可能较低,应谨慎使用。

Elasticsearch 查询实战:从入门到精通,架构师带你玩转 ES 检索

8. Fuzzy Query(模糊查询)

fuzzy 查询允许进行模糊匹配,通过指定 fuzziness 参数来控制允许的编辑距离(Levenshtein Distance)。

GET /my_index/_search
{
  "query": {
    "fuzzy": {
      "title": {
        "value": "Elasticserch",
        "fuzziness": "AUTO"  // 自动计算编辑距离
      }
    }
  }
}

fuzziness 参数可以设置为 AUTO,Elasticsearch 会根据查询文本的长度自动计算合适的编辑距离。

9. Query String Query (查询字符串查询)

query_string 查询允许使用 Lucene 查询语法来构建复杂的查询。这种查询功能强大,但是也比较复杂,需要熟悉 Lucene 查询语法。

GET /my_index/_search
{
  "query": {
    "query_string": {
      "default_field": "title",
      "query": "Elasticsearch AND (tutorial OR guide)"
    }
  }
}

Elasticsearch 查询实践与优化

1. 使用 Profile API 分析查询性能

Elasticsearch 提供了 Profile API,可以用于分析查询的性能瓶颈。通过 Profile API,可以了解查询的各个阶段的耗时情况,从而找到优化的方向。

GET /my_index/_search
{
  "profile": true,
  "query": {
    "match": {
      "title": "Elasticsearch tutorial"
    }
  }
}

2. 优化索引 Mapping

合理的 Mapping 设计可以显著提高查询性能。例如,对于不需要分词的字段,应该使用 keyword 类型,避免不必要的分词操作。对于需要进行范围查询的字段,应该使用 datenumeric 类型。

Elasticsearch 查询实战:从入门到精通,架构师带你玩转 ES 检索

3. 使用 Filter Context 过滤数据

对于不需要计算相关性的查询,可以使用 Filter Context。Filter Context 的查询结果会被缓存,可以提高查询性能。

GET /my_index/_search
{
  "query": {
    "bool": {
      "must": {
        "match": {
          "title": "Elasticsearch"
        }
      },
      "filter": {
        "term": {
          "status": "published"
        }
      }
    }
  }
}

4. 避免深度分页

当需要查询大量数据时,应避免使用深度分页(例如 from=10000, size=10)。深度分页会导致 Elasticsearch 扫描大量不必要的数据,影响查询性能。可以考虑使用 Scroll API 或 Search After API 来进行分页查询。

5. 监控 Elasticsearch 集群状态

使用 Kibana 或其他监控工具监控 Elasticsearch 集群的 CPU、内存、磁盘 I/O 等指标,及时发现和解决性能问题。在使用 ES 做全文检索时,除了关注 ES 本身,还要关注上游服务,例如使用 Nginx 做反向代理时,需要关注 Nginx 的连接数、负载均衡策略等。如果使用了宝塔面板,也要注意其资源占用情况,避免影响 ES 的性能。

总结

本文详细介绍了 Elasticsearch 数据库之查询操作的各种语法,并结合实战案例讲解了如何优化查询性能。掌握这些知识,可以让你在实际工作中更加高效地使用 Elasticsearch,解决各种复杂的搜索问题。

Elasticsearch 查询实战:从入门到精通,架构师带你玩转 ES 检索

转载请注明出处: 半杯凉茶

本文的链接地址: http://m.acea1.store/blog/770444.SHTML

本文最后 发布于2026-04-06 09:35:59,已经过了21天没有更新,若内容或图片 失效,请留言反馈

()
您可能对以下文章感兴趣
评论
  • 鸽子王 4 天前
    这篇文章总结的太全面了,ES 的各种查询都讲到了,点赞!
  • 舔狗日记 12 小时前
    bool 查询那块儿写的很清晰,之前一直没搞懂 should 和 must 的区别,现在明白了。
  • 武汉热干面 4 天前
    这篇文章总结的太全面了,ES 的各种查询都讲到了,点赞!