一. 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
}
}
}
}
}