ElasticSearch入门 - Kibana客户端 DSL查询与过滤

版权声明:《==study hard and make progress every day==》 https://blog.csdn.net/qq_38225558/article/details/85873864

什么是dsl??

   由ES提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂、强大的查询。DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现

组成   -->   dsl=dsl查询+dsl过滤

       dsl过滤简单理解为就是精确查询,而dsl查询是模糊查询(like).由于查询需要做相关度排序,并且过滤可以缓存.所有过滤的效率高于查询.所以只有必须要用查询的时候才用它(模糊查询),否则都用过滤

DSL查询:        (注意:使用DSL查询,必须要传递query参数给ES!)

# dsl查询 --> 高级查询+分页+排序+截取字段 【desc:降序 asc:升序 from:从第几页开始 size:每页多少条数据 _source:截图name和age字段】
GET test/user/_search
{
  "query": {
    "match_all": {
      
    }
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ],
  "from": 0,
  "size": 2,
  "_source": ["name","age"]
}

DSL过滤:

DSL过滤语句和DSL查询语句非常相似,但是它们的使用目的却不同:
DSL过滤查询文档的方式更像是对于我的条件“有”或者“没有”,而DSL查询语句则像是“有多像”。
DSL过滤和DSL查询在性能上的区别
     ①过滤结果可以缓存并应用到后续请求。
     ②查询语句同时匹配文档,计算相关性,所以更耗时,且不缓存。
     ③过滤语句可有效地配合查询语句完成文档过滤。
原则上,使用DSL查询做全文本搜索或其他需要进行相关性评分的场景,其它全用DSL过滤。

# dsl过滤 【gt:>  gte:>=  lt:<  lte:<=】
GET test/user/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match_all": {
            
          }
        }
      ],
      "filter": {
        "range": {
          "age": {
            "gte": 10,
            "lte": 20
          }
        }
      }
    }
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ],
  "from": 0,
  "size": 2,
  "_source": ["name","age"]
}


补充小知识:

① 全匹配(match_all)

普通搜索(匹配所有文档):

{
    "query" : {
        "match_all" : {}
    }
}

如果需要使用过滤条件(在所有文档中过滤,【 "must" : [{  "match_all":{}  }], 】部分默认可不写):

{
	"query" : {
		"bool" : {
			"must" : [{
				"match_all":{}
			}],
			"filter":{...}
		}
	}
}

② 标准查询(match和multi_match)

match查询是一个标准查询,不管你需要全文本查询还是精确查询基本上都要用到它。

如果你使用match查询一个全文本字段,它会在真正查询之前用分析器先分析查询字符:

{
	"query": {
		"match": {
			"fullName": "Steven King"
		}
	}
}

上面的搜索会对Steven King分词,并找到包含Steven或King的文档,然后给出排序分值。

如果用 match  下指定了一个确切值,在遇到数字,日期,布尔值或者 not_analyzed的字符串时,它将为你搜索你给定的值,如:
{ "match": { "age": 26 }}
{ "match": { "date": "2014-09-01" }}
{ "match": { "public": true }}
{ "match": { "tag": "full_text" }}

multi_match  查询允许你做 match查询的基础上同时搜索多个字段:

{
	"query":{
		"multi_match": {
			"query": "Steven King",
			"fields": [ "fullName", "title" ]
		}
	}
}

上面的搜索同时在fullName和title字段中匹配。

提示:match一般只用于全文字段的匹配与查询,一般不用于过滤。

③单词搜索与过滤(Term和Terms)

{
	"query": {
		"bool": {
			"must": { 
				"match_all": {} 
			}, 
			"filter": { 
				"term": { 
					"tags": "elasticsearch" 
				} 
			} 
		} 
	}
}

Terms搜索与过滤

{
	"query": {
		"terms": {
			"tags": ["jvm", "hadoop", "lucene"],
			"minimum_match": 2
		}
	}
}

minimum_match:至少匹配个数,默认为1

④ 组合条件搜索与过滤(Bool)

组合搜索bool可以组合多个查询条件为一个查询对象,查询条件包括must、should和must_not。

例如:查询爱好有美女,同时也有喜欢游戏或运动,且出生于1990-06-30及之后的人。

{
	"query": {
		"bool": {
			"must": [{"term": {"hobby": "美女"}}],
			"should": [
				 {"term": {"hobby": "游戏"}}, 
				 {"term": {"hobby": "运动"}} 
			],
			"must_not": [
				{"range" :{"birth_date":{"lt": "1990-06-30"}}} 
			],
			"filter": [...],
			"minimum_should_match": 1
		}
	}
}

提示: 如果 bool 查询下没有must子句,那至少应该有一个should子句。但是 如果有 must子句,那么没有 should子句也可以进行查询。

⑤ 范围查询与过滤(range)

range过滤允许我们按照指定范围查找一批数据:     gt:>    gte:>=   lt:<  lte:<=

ex:查询年龄大于等于18并且小于20。   

{
	"query":{
		"range": {
			"age": {
				"gte": 18,
				"lt": 20
			}
		}
	}
}

⑥ 存在和缺失过滤器(exists和missing)

{
	"query": {
		"bool": {
			"must": [{
				"match_all": {}
			}],
			"filter": {
				"exists": { "field": "gps" }
			}
		}
	}
}

提示:exists和missing只能用于过滤结果。

⑦ 前匹配搜索与过滤(prefix)

和term查询相似,前匹配搜索不是精确匹配,而是类似于SQL中的like ‘key%’

ex:查询姓郑的所有人。

{
	"query": {
		"prefix": {
			"fullName": "郑"
		}
	}
}

⑧ 通配符搜索(wildcard)

使用*代表0~N个,使用?代表1个。

{
	"query": {
		"wildcard": {
			"fullName": "郑*清"
		}
	}
}

最后小结:DSL查询是ES提供的通用查询方式,这种方式最大的特点是开发语言的无关性,即任意的客户端只要支持HTTP请求,就可以通过JSON格式的查询数据完成复杂的搜索。

猜你喜欢

转载自blog.csdn.net/qq_38225558/article/details/85873864