Elasticsearch 的 DSL查询

目录

  • 一、基本结构
  • 二、查询部分
  • 三、过滤部分
  • 四、排序部分
  • 五、分页部分
  • 六、聚合部分
  • 七、其他功能
  • 八、操作示例

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:匹配字段的前缀。
    • wildcardregexp:使用通配符或正则表达式进行匹配。
    • fuzzy:进行模糊匹配,允许一定程度的字符差异。
  • 地理查询

    • geo_bounding_box:基于边界框筛选地理坐标点。
    • geo_distance:筛选距离某个点在一定范围内的文档。
    • geo_shape:基于几何形状(如多边形、线、点等)筛选地理数据。

三、过滤部分

虽然查询部分也可以实现过滤功能,但有时为了提高效率,尤其是对于不需要计算得分的过滤条件,可以使用独立的过滤器(Filter)。常见的过滤器包括:

  • termtermsrange:与同名查询类似,但不计算得分,更高效。
  • existsmissing:检查字段存在与否。
  • geo_bounding_boxgeo_distancegeo_shape:与同名地理查询类似,作为过滤器使用。
  • script:基于脚本条件过滤文档。

四、排序部分

通过 sort 参数指定结果的排序规则,可以按照一个或多个字段的升序或降序排列:

"sort": [
  { "price": { "order": "desc" } },
  { "last_updated": { "order": "asc", "unmapped_type": "date" } }
]

五、分页部分

使用 fromsize 参数控制结果的分页:

"from": 0,  // 从第一个结果开始返回
"size": 10  // 返回10个结果

六、聚合部分

聚合(Aggregations)用于对查询结果进行统计分析、分组、计数等操作,生成汇总数据。常见的聚合类型包括:

  • 桶聚合(Bucket Aggregations)

    • terms:按某个字段的值进行分桶,统计每个桶的文档数量。
    • rangedate_range:基于数值或日期范围分桶。
    • histogramdate_histogram:基于固定间隔的桶划分数据。
    • geohash_gridgeotile_grid:对地理数据进行网格化分桶。
  • 度量聚合(Metric Aggregations)

    • avgsumminmax:计算数值字段的平均值、总和、最小值、最大值。
    • cardinality:估算唯一值的数量。
    • extended_statspercentiles:提供统计指标如标准差、百分位数等。
  • 管道聚合(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)的文档。

  • 19
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值