Elasticsearch 查询 DSL

2025年3月17日 | 阅读11分钟

Query DSL 是 Domain Specific Language(领域特定语言)的缩写。在 Elasticsearch 中,搜索是通过基于 JSON 的搜索查询来执行的。Elasticsearch 提供了完整的查询 DSL,可以帮助定义查询。Elasticsearch 中有两个子句构成一个查询,它们是:

1. 叶子查询子句 -

叶子查询子句是那些在特定字段中搜索特定值的子句,例如 termmatchrange 查询。这些查询可以单独使用。

2. 复合查询子句 -

复合查询是通过组合叶子查询子句和其他复合查询而创建的包装器子句。它有助于提取所需的信息。

查询以 query 关键字开始。它以 JSON 对象的形式包含条件和过滤器。下面将描述带有示例的多个查询列表 -

Match All Query (匹配所有查询)

这是一个基本查询,它返回指定索引中的所有文档。它为每个对象返回文档的所有数据,得分(score)为 max_score 1.0。请看下面的示例 -

复制代码

响应

上面的查询将获取 book 索引中存在的所有文档,并将它们返回给用户。请看下面的响应 -

截图

请看浏览器中的截图 -

Elasticsearch Query DSL

Full Text Query (全文查询)

全文查询是高级查询。它们负责在全文字段上运行全文查询,并理解字段是如何被查询的。全文查询根据与特定文档或索引关联的分析器工作。我们将讨论不同类型的全文查询。

查询描述
匹配此查询执行全文查询搜索。
multi_match此查询允许用户通过匹配多个字段中的文本或短语来搜索文档。
match_phrase它负责匹配精确的短语匹配。
match_phrase_prefix此查询有助于对最后一个词执行通配符搜索。
comman_terms此查询给予不常见词更高的偏好。
query_stringquery_string 允许我们在单个查询中通过指定 AND|OR|NOT 条件来执行多字段搜索。
simple_query_stringsimple_query_string 是 query_string 的一个健壮版本。

让我们逐一讨论每个全文查询 -

Match Query (匹配查询)

此查询有助于通过将文本与一个或多个字段的值进行匹配来获取文档。

在下面的示例中,我们将执行一个查询来获取在 state 字段中包含 Hauston 状态的文档。请注意,它将在所有以 student 结尾的索引中搜索这些文档。例如:student、student1、student2 等。

复制代码

响应

通过执行上述查询,从 student 和 student1 索引中返回了两个文档。请看下面的输出 -

截图

Elasticsearch Query DSL

Multi Match Query (多匹配查询)

此查询允许用户通过匹配多个字段中的文本或短语来搜索文档。

在下面的示例中,我们将搜索在 street、state 或两者中包含 Rodney 的文档。

复制代码

响应

通过执行上述查询,我们获得了三个文档,两个来自 student 索引,另一个来自 student1 索引。请看下面的输出 -

截图

Elasticsearch Query DSL

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

此查询允许我们获取任何字段包含传递给查询字符串的文本的文档。

在下面的示例中,我们将传递一个字符串 "Horse riding" 在 student* 索引中进行搜索,并显示所有匹配的文档。

复制代码

响应

通过执行上述查询,我们获得了两个文档,一个来自 student 索引,另一个来自 student1 索引。请看下面的输出 -

截图

请看下面的截图,从数据库中获取了两个包含 Horse Riding 字符串在 Hobbies 字段中的文档。

Elasticsearch Query DSL

Term Level Query (词条级别查询)

词条级别查询处理结构化数据,而不是全文字段搜索。结构化数据如数字、日期、枚举等。请看词条级别查询的示例 -

复制代码

响应

通过执行上述查询,我们将获得所有邮政编码为 76011 的文档。

截图

Elasticsearch Query DSL

Range Query (范围查询)

范围查询允许我们搜索值在指定范围内的文档。要执行范围查询,我们需要使用一些运算符,例如 -

  • lt - 小于
  • lte - 小于等于
  • gt - 大于
  • gte - 大于等于

通过应用任何这些条件,我们可以对给定范围内的分类数据进行条件判断。请看下面的示例 -

复制代码

响应

通过执行上述查询,从 student 索引中获取了两个文档,其中 fees 大于 50000,因为我们使用了 gt 条件。请看下面的响应 -

同样,我们可以根据需要使用 gte、lt 或 lte 等其他条件来分类和获取文档。

截图

Elasticsearch Query DSL

其他类型的词条级别查询

以下是一些词条级别查询 -

查询描述
任期term 查询有助于搜索包含查询中指定的精确词条的文档。
条款此查询与 term 查询略有不同。它有助于查找包含查询中指定的任何精确词条的文档。
范围它有助于搜索包含查询中为特定字段指定的范围的文档。
Existsexists 查询有助于查找字段具有任何非空值的文档。
missing query (缺失查询)缺失查询与 exists 查询正好相反。与 exists 查询不同,它查找不包含特定字段或字段值为 null 的文档。
前缀它搜索包含以查询中指定的精确前缀开头的词条的文档。
通配符它有助于搜索包含与查询指定的模式匹配的词条的文档。
Regexp它在查询中使用正则表达式来查找对象中的某个模式。
Fuzzy它允许我们查找词条与指定词条模糊相似的文档。
类型type 查询有助于查找指定类型的文档。
Ids此查询负责查找指定类型和 ID 的文档。

Type Query (类型查询)

类型查询允许我们查找用户在查询中指定的特定类型(默认为 _doc)的文档。在 Elasticsearch 中,默认文档类型是 _doc,但文档类型也可以是用户定义的。

如果存在查询中指定的特定类型的文档,它将返回这些文档列表,否则将返回 null 值。

例如 -

复制代码

响应

通过执行上述查询,从我们创建的多个索引(如 - bookstudentnew_studentstudent1)中返回了许多 _docs 类型的文档。请看下面的输出 -

截图

在下面的截图中,您可以看到从 book 和 student 索引返回的文档是 _doc 类型,正如查询中所指定的搜索一样。

Elasticsearch Query DSL

现在,转向我们之前简要讨论过的复合查询。在这里,我们将详细介绍复合查询并提供示例。

Compound Query (复合查询)

顾名思义,复合查询是不同查询的集合。这些查询使用 AND、OR、NOT 等布尔运算符,或者用于多个索引或具有函数调用的方式合并在一起。

它负责包装叶子查询和其他查询。基本上,这些查询用于组合它们的搜索结果、更改它们的行为或从查询上下文切换到过滤上下文。让我们用下面的示例来理解复合查询 -

复制代码

响应

上述查询返回了 0 个文档,max_socre 为 null,total 值为零。请看下面的响应 -

截图

Elasticsearch Query DSL

Geo Query (地理查询)

地理查询处理地理点和地理位置。它有助于查找学校或任何地理对象附近的位置。为此,我们需要使用地理点数据类型,如地点的位置。请记住,Elasticsearch 支持两种类型的地理数据(geo_point 和 geo_shape),它们是 -

geo_point - geo_points 是支持经纬度对的字段。

geo_shape - 与 geo_points 类似,geo_shape 也是支持点、线、圆、多边形和多重多边形等的字段。

请看下面给出的示例 -

复制代码

执行以下查询以创建名为 geo_query_example 的索引,并包含映射和位置。

响应

通过执行上述代码,已创建名为 geo_query_example 的索引。请看下面的响应 -

截图

Elasticsearch Query DSL

向索引添加数据

现在,将以下数据添加到上面创建的 geo_query_example 索引中。

响应

通过执行上述代码,数据已成功添加到 geo_query_example 索引中。请看下面的响应 -

截图

Elasticsearch Query DSL