目录
- 一、基本结构
- 二、查询部分
- 三、过滤部分
- 四、排序部分
- 五、分页部分
- 六、聚合部分
- 七、其他功能
- 八、操作示例
Elasticsearch 的 DSL(Domain Specific Language,领域特定语言)查询是一种使用 JSON 格式表达的查询语言,用于与 Elasticsearch 集群进行复杂的搜索交互。DSL 查询提供了丰富的查询类型、过滤条件、排序选项、分页控制、聚合功能等,使得用户能够精确地描述想要从索引中检索的数据,并获得结构化的搜索结果。
一、基本结构
一个典型的 Elasticsearch DSL 查询请求通常包含以下几个部分:
{
"query": {
... // 查询部分,定义如何匹配和筛选文档
},
"sort": {
... // 排序部分,定义结果的排序规则
},
"from": <offset>, // 分页偏移量,从第几个结果开始返回
"size": <limit>, // 分页限制,返回多少个结果
"aggs": {
... // 聚合部分,定义对结果进行的聚合分析
},
"highlight": {
... // 高亮部分,定义查询结果中哪些字段应进行高亮显示
},
... // 其他可能的参数,如脚本、源过滤、Suggesters等
}
二、查询部分
查询部分是 DSL 请求的核心,用于定义如何从索引中筛选出符合特定条件的文档。Elasticsearch 提供了众多查询类型,包括但不限于:
-
全文查询:
match
:最常用的全文查询,对一个或多个字段进行模糊匹配。multi_match
:在多个字段上执行match
查询。match_phrase
:匹配整个短语而非单个词项。match_phrase_prefix
:匹配短语的前缀。
-
精确查询:
term
:精确匹配一个词项,适用于未分析的字段(如keyword
类型)。terms
:匹配多个精确值。range
:基于范围条件(如大于、小于、介于等)筛选文档。
-
复合查询:
bool
:组合多个查询条件,支持must
(与)、should
(或)、must_not
(非)子句。constant_score
:将过滤器或查询包装在一个不计算得分的上下文中。dis_max
:选择多个查询中最匹配的一个文档得分。
-
特殊查询:
exists
:检查字段是否存在。prefix
:匹配字段的前缀。wildcard
、regexp
:使用通配符或正则表达式进行匹配。fuzzy
:进行模糊匹配,允许一定程度的字符差异。
-
地理查询:
geo_bounding_box
:基于边界框筛选地理坐标点。geo_distance
:筛选距离某个点在一定范围内的文档。geo_shape
:基于几何形状(如多边形、线、点等)筛选地理数据。
三、过滤部分
虽然查询部分也可以实现过滤功能,但有时为了提高效率,尤其是对于不需要计算得分的过滤条件,可以使用独立的过滤器(Filter)。常见的过滤器包括:
term
、terms
、range
:与同名查询类似,但不计算得分,更高效。exists
、missing
:检查字段存在与否。geo_bounding_box
、geo_distance
、geo_shape
:与同名地理查询类似,作为过滤器使用。script
:基于脚本条件过滤文档。
四、排序部分
通过 sort
参数指定结果的排序规则,可以按照一个或多个字段的升序或降序排列:
"sort": [
{ "price": { "order": "desc" } },
{ "last_updated": { "order": "asc", "unmapped_type": "date" } }
]
五、分页部分
使用 from
和 size
参数控制结果的分页:
"from": 0, // 从第一个结果开始返回
"size": 10 // 返回10个结果
六、聚合部分
聚合(Aggregations)用于对查询结果进行统计分析、分组、计数等操作,生成汇总数据。常见的聚合类型包括:
-
桶聚合(Bucket Aggregations):
terms
:按某个字段的值进行分桶,统计每个桶的文档数量。range
、date_range
:基于数值或日期范围分桶。histogram
、date_histogram
:基于固定间隔的桶划分数据。geohash_grid
、geotile_grid
:对地理数据进行网格化分桶。
-
度量聚合(Metric Aggregations):
avg
、sum
、min
、max
:计算数值字段的平均值、总和、最小值、最大值。cardinality
:估算唯一值的数量。extended_stats
、percentiles
:提供统计指标如标准差、百分位数等。
-
管道聚合(Pipeline Aggregations):
- 可以对其他聚合的结果进行二次处理,如求差、求和、计算移动平均等。
七、其他功能
-
高亮:通过
highlight
参数指定在查询结果中哪些字段应进行高亮显示,便于用户识别匹配关键词。 -
脚本:在查询、排序、过滤、聚合等环节中使用脚本进行动态计算或条件判断。
-
源过滤:通过
source
参数指定返回结果中包含或排除哪些字段。 -
Suggesters:提供自动补全、纠错等建议功能。
八、操作示例
下面是一个包含全文查询、过滤、排序和分页的 DSL 示例:
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Elasticsearch" } },
{ "range": { "price": { "gte": 10, "lte": 50 } } }
]
}
},
"sort": [
{ "popularity": { "order": "desc" } },
{ "last_updated": { "order": "asc" } }
],
"from": 0,
"size": 10
}
在这个示例中,查询要求文档的 title
字段包含 “Elasticsearch”,且 price
在 10 到 50 之间。结果按照 popularity
降序、last_updated
升序排序,返回第一页(from
为 0,size
为 10)的文档。