跳到主要内容

Elasticsearch 精确查询

Elasticsearch 是一个强大的分布式搜索引擎,广泛用于全文搜索、结构化搜索和分析。在实际应用中,我们经常需要精确匹配某些字段的值,而不是进行模糊搜索。这时,精确查询就派上了用场。

什么是精确查询?

精确查询(Exact Match Query)是指查询条件与文档中的字段值完全匹配的查询方式。与全文搜索不同,精确查询不会对查询条件进行分词处理,而是直接匹配字段的原始值。这种查询方式适用于需要精确匹配的场景,例如匹配ID、状态码、标签等。

在Elasticsearch中,精确查询通常使用 term 查询或 terms 查询来实现。

精确查询的基本语法

1. term 查询

term 查询用于匹配字段的精确值。它不会对查询条件进行分词处理,而是直接匹配字段的原始值。

json
{
"query": {
"term": {
"field_name": "exact_value"
}
}
}

示例

假设我们有一个索引 products,其中包含以下文档:

json
{
"id": 1,
"name": "Elasticsearch Guide",
"category": "books"
}
{
"id": 2,
"name": "Programming in Python",
"category": "books"
}
{
"id": 3,
"name": "Learning Elasticsearch",
"category": "ebooks"
}

如果我们想查询 category 字段值为 "books" 的文档,可以使用以下查询:

json
{
"query": {
"term": {
"category": "books"
}
}
}

输出结果

json
{
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"hits": [
{
"_id": "1",
"_source": {
"id": 1,
"name": "Elasticsearch Guide",
"category": "books"
}
},
{
"_id": "2",
"_source": {
"id": 2,
"name": "Programming in Python",
"category": "books"
}
}
]
}
}

2. terms 查询

terms 查询是 term 查询的扩展,允许我们同时匹配多个精确值。

json
{
"query": {
"terms": {
"field_name": ["value1", "value2", "value3"]
}
}
}

示例

如果我们想查询 category 字段值为 "books""ebooks" 的文档,可以使用以下查询:

json
{
"query": {
"terms": {
"category": ["books", "ebooks"]
}
}
}

输出结果

json
{
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"hits": [
{
"_id": "1",
"_source": {
"id": 1,
"name": "Elasticsearch Guide",
"category": "books"
}
},
{
"_id": "2",
"_source": {
"id": 2,
"name": "Programming in Python",
"category": "books"
}
},
{
"_id": "3",
"_source": {
"id": 3,
"name": "Learning Elasticsearch",
"category": "ebooks"
}
}
]
}
}

精确查询的实际应用场景

1. 匹配状态码

在日志分析中,我们经常需要根据状态码(如HTTP状态码)来过滤日志。使用 term 查询可以精确匹配特定的状态码。

json
{
"query": {
"term": {
"status_code": 404
}
}
}

2. 过滤特定标签

在电商网站中,商品通常会有多个标签。我们可以使用 terms 查询来过滤出包含特定标签的商品。

json
{
"query": {
"terms": {
"tags": ["electronics", "smartphone"]
}
}
}

3. 精确匹配ID

在用户管理系统中,我们可能需要根据用户ID来精确查找用户信息。

json
{
"query": {
"term": {
"user_id": "12345"
}
}
}

总结

精确查询是Elasticsearch中非常重要的查询方式,适用于需要精确匹配字段值的场景。通过 termterms 查询,我们可以轻松实现精确匹配,从而快速找到符合条件的文档。

提示

在使用精确查询时,请确保字段的映射类型是 keyword,而不是 text。因为 text 类型的字段会进行分词处理,而 keyword 类型的字段则不会。

附加资源与练习

  1. 练习:尝试在你的Elasticsearch索引中创建一个包含 keyword 类型字段的映射,并使用 term 查询进行精确匹配。
  2. 进一步学习:了解Elasticsearch中的其他查询类型,如 matchrangebool 查询,以扩展你的查询技能。

通过掌握精确查询,你将能够更高效地处理结构化数据,并在实际应用中发挥Elasticsearch的强大功能。