Elasticsearch之DSL常用的DSL查询API

本文基于Elasticsearch 6.1 版本学习

Request Body Search

  • 将查询语句通过 http request body 发送到es, 主要包含如下参数:
      - query 符合Query DSL 语法查询语句
      - from,size
      - timeout
      - sort

      - ...
    图-1
  • Query DSL
    基于json定义的查询语言,主要包含如下两种类型:
      - 字段类查询: 如term,match,range等,只针对某一个字段进行查询。 
      - 复合查询: 如bool查询等, 包含一个或多个字段类查询或符合查询语句。
  • 字段类查询主要包括以下两类:
      - 全文匹配: 针对text类型的字段进行全文检索,会对查询语句先进行分词处理,如match,match_pharse,等query类型。
      - 单词匹配:不会对查询语句做分词处理,直接去匹配字段的倒排索引,如term,terms,range等query类型
  • match Query
    对字段作全文检索,最基本和常用的查询类型,API示例如下:
    match query
    返回结果
    match query查询流程

      - 通过operator参数可以控制单词间的匹配关系,可选项为or 和 and
    operator
    以上 operator 为 and,即必须同时包含 alfred 和 way 才满足。
      - 通过 minimum_should_match 参数可以控制需要匹配的单次数
    minimum_should_match
  • Match phrase Query
    对字段作检索,有顺序要求,API示例如下:
    Match phrase Query
    响应

      - 通过 slop 参数可以控制单词间的间隔
    slop
  • Query String Query
    类似于URI Search 中的 q 参数查询
    Query String Query
    以上查询是指查询username字段同时包含alfred和way字段的文档。
    Query String Query
    以上查询是指查询username和job字段包含alfred或者同时包含java和ruby的文档
  • Simple Query String Query
    类似 Query String ,但是会忽略错误的查询语法,并且仅支持部分查询语法,器常用的逻辑符号如下,不能使用AND,OR,NOT 等关键词
      +:代指 AND
      | :代指 OR
      - :代指 NOT
    Simple Query String Query
  • Term Query
    将查询语句作为整个单词进行查询,即不对查询语句做分词处理,如下图所示:
    Term Query
    查询username字段包含alfred的所有文档
  • Terms Query
    一次传入多个单词进行查询,如下图所示:
    Terms Query
  • Range Query
    范围查询主要针对数值和日期类型,如下所示:
    Range Query
    针对日期做查询如下:
    日期查询
    针对日期提供的一种更友好的计算方式,格式如下
    日期查询
    单位主要有如下几种:

  - y - years
  - M - months
  - w- weeks
  - d - days
  - h - hours
  - m - minutes
  - s - seconds
假设now为2018-01-02 12:00:00,那么如下计算结果为:

计算公式 实际结果
now + 1h 2018-01-02 13:00:00
now - 1h 2018-01-02 11:00:00
now - 1h/d 2018-01-02 00:00:00
  • Bool Query
    布尔查询由一个或多个布尔子句组成,主要包含如下4个:
关键词 功能
filter 只过滤符合条件的文档,不计算相关性得分
must 文档必须符合must中所有条件,会影响相关性算分
must_not 文档必须不符合must_not中的所有条件
should 文档可以符合should中的条件,会影响相关性算分

Bool查询的API如下所示:

Bool API

  - Filter
    es针对filter会有智能缓存,因此其执行效率很高
    做简单的匹配查询且不考虑算分时,推荐使用filtrer代替query等
filter

  - Must
must

  - Must_Not
must_not

  - Should
  should使用分两种情况:
   1. bool查询中只包含should,不包含must查询。只包含should时,文档必须满足至少一个条件,我们通过设置minimum_should_match可以控制满足条件的个数或者百分比
image.png

   2. bool查询中同时包含should和must时,文档不必满足should中的条件,但是如果满足条件,会增加相关性算分
image.png

  • Count
    获取符合条件的文档数,endpoint为 _count, API及返回结果如下:
    count
  • Source Filtering
    过滤返回结果中的 _source中的字段,主要有如下几种方式:
    Source Filtering
  • Sorting(排序)
    es默认会采用相关性算分排序,用户可以通过设定 sorting 参数来自定义排序规则,api 如下:
    排序
    排序

    按照字符串排序比较特殊,因为 es 有 text 和 keyword 两种类型,针对text 类型排序,会报错,如下图所示:
    排序
    我们可以设置Fielddata参数来实现,Fielddata 默认是关闭的,可以通过以下API进行开启:
    Fielddata

    针对keyword类型排序,可以返回预期的结果:
    keyword 排序
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容