Elasticsearch Query DSL 整理总结(查询)

一、概念

es提供的以restful风格进行交互的DSL,请求体是JSON格式。
主要有两种类型:
第一种是叶子查询语句(Leaf Query),用于查询某个特定的字段,例如match,term,
第二种是复合查询语句,也就是组合了多个叶子查询或者嵌套了其它的复合查询的语句,例如bool组合查询、
fifter查询、range查询等等,是根据多个字段的查询组成。

二、Query and filter 的区别

query语句查询的时候,要计算匹配度(_score分数),fifter与会值关心是否匹配,不会计算得分。
GET /_search
{
   
  "query": {
   
    "bool": {
   
      "": [
        {
    "match": {
    "title":   "Search"        }},
        {
    "match": {
    "content": "Elasticsearch" }}
      ],
      "filter": [
        {
    "term":  {
    "status": "published" }},
        {
    "range": {
    "publish_date": {
    "gte": "2015-01-01" }}}
      ]
    }
  }
}

例子分析:

(1)、query参数在最外层,所以是处于整个query context中。
(2)、整个bool查询,都是query的子查询语句,所以里面的must、match会计算得分(匹配度)
(3)、bool子查询语句中的被filter包裹起来的部分,是处于fifter context中,不会计算得分。

三、查询语句

1、简单查询

	(1)、GET /lib/user/_search  : 查询lib索引下的user类型的全部数据

	(2)、GET /lib/_search :查询lib索引下的全部类型的数据
	
	(3)、GET /_search :查询全部索引下的数据

2、精确查找

 如果需要按照精确值进行查询,最好是使用过滤器fifter,因为不会计算评分,而且容易被缓存。
 结合term查询,也就是对查询条件不做分词处理,精确匹配,一般用于id/数值/日期/布尔类型的查询
 constant_score,以非评分模式来执行term查询,将term转化为过滤器查询

(1)、精确查找数值:

	GET /my_store/products/_search
	{
   
	    "query" : {
   
	        "constant_score" : {
     
	            "filter" : {
   
	                "term" : {
    
	                    "price" : 20
	                }
	            }
	        }
	    }
	}

(2)、精确查找文本:

由于可能之间插入的时候,文本就已经分词存储了,但是term查询的时候又是精确查找,可能就找不到对应的
分词,所以如果文本要精确查找,mapping映射就要手动设置该文本字段不分词
DELETE my_store   //先删除索引

PUT /my_store    //手动指定映射
{
   
    "mappings" : {
   
        "products" : {
   
            "properties" : {
   
                "productID" : {
   
                    "type" : "string",
                    "index" : "not_analyzed"    //不分词
                }
            }
        }
    }

}

(3)、多值精确匹配

通过terms指定多组值,可以指定返回的文档数量和字段
GET /my_store/products/_search
{
   
  "from":0,    //从第一文档开始
  "size":2,     //查询两个文档
  "_source":["address","age"],  //返回的字段
    "query":{
   
      "terms":{
   
        "price":[20,10,30]
      }
    }
}

3、模糊查询

通过match查询,和term查询相反,会对搜索词语进行分词

(1)、match匹配(普通分词匹配)

GET /my_store/products/_search
{
   
    "query" : {
   
                "match" : {
   
                    "productID" : "XHDK-A-1293-#fJ3"
            }
    }
}

(2)、match_all查询所有 (普通分词匹配,无匹配条件,查询所有)


GET /my_store/products/_search
{
   
  "query": {
   
    "match_all": {
   
  
    }
  }
}

(3)、match_phrase(分词短语匹配)

短语匹配,对query条件里面的短语看成是一个整体,进行匹配,文档里面包含这个词项列表,
并且词项之间的顺序都是一样,也没有其它字符的间隔,就可以返回。

也可以使用slop这个关键字指定相隔的步长,也就是词项之间可以隔开的间隙,这样匹配规则就宽松一些。
GET /lib/user/_search
{
   
  "query": {
   
    "match_phrase": {
   
      "address": "huibei,wuhan"
    }
  }
}

4、match 的细节和本质

(1)、match本质上是一种bool类型的查询,有一个默认隐藏的参数operator,
默认的值是OR,例如以下例子,本质上就是搜索满足hobbies字段匹配football  或者basketball的文档
operator还可以显式的设置为and
GET matchtest/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值