DSL查询:
DSL全称Domain Specific language,即特定领域专用语言。
DSL,把查询条件写在JSON里面,然后进行相关的查询。
DSL主要分为查询DSL(query DSL)和过滤DSL(filter DSL)。
query DSL:
query match : 分词后才进行匹配。
GET 索引名称/_search
{"query" : { "match" : { "字段": "匹配内容" }}
}
- multi_match 查询:
multi_match查询允许你做match查询的基础上同时搜索多个字段,在多个字段中同时查一个:
{"multi_match": {"query": "查询内容","fields": [ "字段名称", "字段名称" ]}
}
filter DSL:
在过滤器Filter中,查询会回答这个问题——“这个文档匹不匹配?”
答案很简单,是或者不是。它不会去计算任何分值,也不会关心返回的排序问题,因此效率会高一点。
过滤上下文 是在使用filter参数时候的执行环境,比如在bool查询中使用Must_not或者filter
另外,经常使用过滤器,ES会自动的缓存过滤器的内容,这对于查询来说,会提高很多性能。
- term 过滤 :
term主要用于精确匹配哪些值.格式如下:
{"query": {"term": {"字段名称": "匹配内容"}}
}
- terms 过滤:
terms 跟 term 有点类似,但 terms 允许指定多个匹配条件。 如果某个字段指定了多个值,那么文档需要一起去做匹配。
terms ,类似于mysql中的in关键字。
格式如下:
{"query": {"terms": {"字段名称": ["匹配内容","匹配内容"]}}
}
- range 过滤:
range过滤允许我们按照指定范围查找一批数据:
{"range": {"age": {"gte": 20,"lt": 30}}
}
范围操作符包含:
gt : 大于。greater than gte: 大于等于。greater than or equallt : 小于。 less thanlte: 小于等于。 less than or equal from 和to : from类似于gte,to类似于lte
格式如下:
{"query": {"range": {"字段名称": {"gt": 3}}}
- filter过滤:
{"query": {"bool": {"filter": {"range": {"字段名称": {"gte": 10,"lt": 27}}}}}
}
- bool 查询/过滤:如果要执行多个关键词的and、or搜索,必须使用布尔查询过滤。
bool 查询/过滤可以用来合并多个过滤条件查询结果的布尔逻辑,它包含以下操作符:
must : 多个查询条件的完全匹配,相当于 and。must_not : 多个查询条件的相反匹配,相当于 not。should : 至少有一个查询条件匹配, 相当于 or。
bool查询,如下所示:
"query": { "bool": { "must": [{ "match": { "字段名称": "匹配内容" }}, { "match": { "字段名称": "匹配内容" }} ]}}
bool过滤,如下所示:
{"bool": {"must": { "term": { "字段名称": "匹配内容" }},"must_not": { "term": { "字段名称": "匹配内容" }},"should": [{ "term": { "字段名称": "匹配内容" }},{ "term": { "字段名称": "匹配内容" }}]}
}
- exist:字段是否存在。类似于 mysql中的 IS NOT NULL
{"query": {"bool": {"must": [{ "exists" : {"field" : "color" } }]}}
}
- missing : 跟exist相反。类似于mysql中的 IS NULL
其他查询
- es 查询索引别名:
GET /索引名称/_alias/*
- es 添加/更新别名:
PUT /索引名称/_alias/别名名称
filter DSL和query DSL的区别:
而filter是精确匹配(exact-values)。而query是全文检索(full-text)。
filter只返回是否匹配,而query会返回相关度的分数score,并进行排序。
filter会进行缓存,query不会。
filter更快一些。query相对较慢。
如果你的查询是范围和类型比较广的,用filter; 如果是要求比较精准的,就用query来查询。
- 同时使用query DSL和filter DSL,如下所示:
"query": {"filtered": {"query": { "match": { "字段名": "匹配内容" }},"filter": { "term": { "字段名": "匹配内容" }}}}
参考资料:
http://blog.itpub.net/29715045/viewspace-2653369/
https://blog.csdn.net/qq_29580525/article/details/80908523
https://www.cnblogs.com/ghj1976/p/5293250.html