DSL-领域专用语言

一. DSL 概述

DSL-Domain Specific Language,领域专用语言,ES提供了基于JSON的DSL来定义查询。

DSL query

二. 叶子查询

叶子查询是复合查询的基础,复合查询就是关键字+叶子查询组合

2.1 模糊匹配

模糊匹配主要是针对文本类型的字段

文本类型的字段,在存储时内容进行分词

在查询时,也会对搜索条件进行分词

结果:条件分词和内容分词进行倒排索引查找,返回匹配的数据

  • match 分词全字段匹配,支持以下参数
    • query : 指定匹配的值
    • operator : 匹配条件类型
      • and : 条件分词后都要匹配
      • or : 条件分词后有一个匹配即可(默认)
      • minmum_should_match : 指定最小匹配的数量
  • prefix 前缀匹配
  • regexp 通过正则表达式来匹配数据
  • match_phase 会对输入做分词,但是需要结果中也包含所有的分词,而且顺序要 求一样
  • query_string 和match类似,但是match需要指定字段名,query_string是在所 有字段中搜索,范围更广泛。
GET /_search
{
  "query": {
    "match": {
      "message": "this is a test"
    }
  }
}

2.2 精确匹配

  • term : 单个条件相等
  • terms : 单个字段属于某个值数组内的值
  • range : 字段属于某个范围内的值
  • exists : 某个字段的值是否存在
  • ids : 通过ID批量查询

三. 组合查询

组合条件查询是将叶子条件查询语句进行组合而形成的一个完整的查询 条件.

3.1 bool

组合关键字,各条件之间有and,or或not的关系

3.1.1 must

各个条件都必须满足,即各条件是and的 关系

3.1.2 should

各个条件有一个满足即可,即各条件 是or的关系

3.1.3 must_not

不满足所有条件,即各条件是not的关系

3.1.4 filter

不计算相关度评分,它不计算_score 即相关度评分,效率更高

POST _search
{
  "query": {
    "bool" : {
      "must" : {
        "term" : { "user.id" : "kimchy" }
      },
      "filter": {
        "term" : { "tags" : "production" }
      },
      "must_not" : {
        "range" : {
          "age" : { "gte" : 10, "lte" : 20 }
        }
      },
      "should" : [
        { "term" : { "tags" : "env1" } },
        { "term" : { "tags" : "deployed" } }
      ],
      "minimum_should_match" : 1,
      "boost" : 1.0
    }
  }
}

3.2 constant_score :

不计算相关度评分

GET _search
{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "status": "active"
        }
      }
    }
  }
}

3.3 连接查询(多文档合并查询)

  • 父子文档查询:parent/child
  • 嵌套文档查询: nested

3.4 query DSL vs filter DSL

query DSL

在查询上下文中,查询会回答这个问题——“这个文档匹不匹配这个查询,它的相关度高么?”

如何验证匹配很好理解,如何计算相关度呢?ES中索引的数据都会存储一个 _score分值,分值越高就代表越匹配。另外关于某个搜索的分值计算还是很复杂的,因此也需要一定的时间。

filter DSL

在过滤器上下文中,查询会回答这个问题——“这个文档匹不匹配?” 答案很简单,是或者不是。它不会去计算任何分值,也不会关心返回的排序问 题,因此效率会高一点。

过滤上下文 是在使用filter参数时候的执行环境,比如在bool查询中使用 must_not或者filter ,另外,经常使用过滤器,ES会自动的缓存过滤器的内容,这对于查询来说,会提高很多性能。

四.查询案例

1. 精确查询

字段映射类型属于为keyword,通过term精确匹配查询

 POST /es_db/_doc/_search 
 {
  "query": {
    "term": {
      "name": "admin"
    }
  }
}
SQL: select * from student where name = 'admin'

2. 模糊查询

POST /es_db/_doc/_search  
{
  "from": 0,
  "size": 2,
  "query": {
    "match": {
      "address": "广州"
    }
  }
}
----------------多字段-----------------------
//多字段模糊匹配查询
POST /es_db/_doc/_search 
{
  "query": {
    "multi_match": {
      "query": "张三",
      "fields": [
        "address",
        "name"
      ]
    }
  }
}
SQL: select * from student where name like '%张三%' or address like '%张 三%'

3. query_string

--------不指定字段----------
POST /es_db/_doc/_search  
{
  "query": {
    "query_string": {
      "query": "(广州) OR 长沙"
    }
  }
}
--------指定字段----------
POST /es_db/_doc/_search  
{
  "query": {
    "query_string": {
      "query": "admin OR 长沙",
      "fields": [
        "name",
        "address"
      ]
    }
  }
}

4. 范围查询 range

关键字

  • gte 大于等于
  • lte 小于等于
  • gt 大于
  • lt 小于
  • now 当前时间
POST /es_db/_doc/_search  
{
  "query": {
    "range": {
      "age": {
        "gte": 25,
        "lte": 28
      }
    }
  }
}

4. 分页

POST /es_db/_doc/_search 
{
  "query": {
    "range": {
      "age": {
        "gte": 25,
        "lte": 28
      }
    }
  },
  "from": 0,
  "size": 2,
  "_source": [
    "name",
    "age",
    "book"
  ],
  "sort": {
    "age": "desc"
  }
}
sql : select name,age,book from user order by age desc limit 0,2 

5. Filter

POST /es_db/_doc/_search 
{
  "query": {
    "bool": {
      "filter": {
        "term": {
          "age": 25
        }
      }
    }
  }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容