ElastaticSearch-----es的DSL查询与过滤
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 equal
lt : 小于。 less than
lte: 小于等于。 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/