5.5_es的查询

专题系列—es的查询:

1)term 查询:(精确查找)
什么是term查询:
	term查询类似于mysql中的 = 判断.
	需要精确查找时,使用term。

eg:

{
     "query": {
          "term": {
               "province": {  // 字段名
                    "value": "日本省"   // 查询 province字段中,为日本省的数据;
               }
          }

     }
}
2)terms 查询:(批量的 精确查找)
什么是terms查询:
		一个字段(field)对应多个值,相当于sql中的in或者是or.

类似于:
		province in (?,?,?)
     	province = ? or province = ?

eg:

{
     'query':{
          'terms':{
               'tag':["a",'b','c']   // 查询terms字段中,tag标签为a b c的数据;
          }
     }
}
3)match 查询:
在匹配时,会对所查找的关键词进行分词,然后按分词匹配查找,一般用于模糊匹配。 


match和term的区别:
		match在匹配时会对所查找的关键词进行分词,然后按分词匹配查找;一般`模糊查找`的时候,多用match。
		而term会直接对关键词进行查找,没有分析器分析的过程。一般用于需要`精确查找`时,才会使用term。
4)match_all 查询:
	查询指定索引下的,所有文档;
	
类似于:select * ...	
 // sms-logs-index:索引;  _search:说明要做查询操作 
POST /sms-logs-index/_search   
{
  "query": {
    "match_all": {}   // 查询 sms-logs-index 索引下的所有数据;
  }
}
5)sort 排序:
通过sort把结果排序:
                    desc 降序
                    asc  升序

eg:

GET /library/books/_search
{
     "query":{
          "match_all":{}
     },
     "sort":[
          {
               "price":{    // 根据这个字段
                        "order":"desc"  // asc 升序
                       }
          }
     ]
}
6)match (一个值,查询一个字段):
即,条件查询. 
		用一个值作为条件,针对某一个字段(field)的范围内,进行全文检索;

eg:

POST /sms-logs-index/_search
{
     "query": {
          "match": {
               "a字段": "北京"   // 查询a字段内含有“北京”的,所有数据;
          }
     },
     "sort": [
          {
               "date": {
                    "order": "desc"   // 并将查询结果根据date日期,进行降序排列;
               }
          }
     ]
}
7)multi_match(多个字段一个值):
multi_match 查询: (多个字段一个值)
	 用一个值作为查询条件,针对多个字段,进行全文检索;

eg:

POST /sms-logs-index/_search
{
  "query": {
    "multi_match": {
      "query": "北京",
      "fields": ["a字段","b字段"]   // 查询a字段、b字段内,含有“北京”的所有数据;
    }
  }
}
8)ids查询 :
	根据多个id做,类似于in的查询效果. 

类似于:
       id in (?,?,?)
//  1. ids查询.
POST /sms-logs-index/_search
{
     "query": {
          "ids": {
               "values": [1,2,3,4]   // 查询id为1,2,3,4的数据;
          }
     }
}
9)range范围查询:
range查询主要是,针对数值类型的.  

eg:

 // 5. range 查询.
POST /sms-logs-index/_search
{
     "query": {
          "range": {
               "fee": {
                    "gte": 5,
                    "lt": 200    // 查询“fee”字段里边的数据,范围是值为:5~200之间的数据;
               }
          }
     }
}
10)复合查询—bool查询.
bool查询,提供三种复合方式.
	must: [{},{}]		-->  必须全部都满足.
	should: [{},{}]	-->  满足一项即可.
	must_not: [{},{}]   -->  不能是xxx.
比如:
{
     "query": {
          "bool": {
               "must": [{},{}],
               "should": [{},{}],
               "must_not": [{},{}] 
          }
     }
}

eg:

// bool查询. 
	// fee费用大于 5
	// province 只能是 上海
	// smsContent不能包含 月
POST /sms-logs-index/_search
{
     "query": {
          "bool": {
               "must": [
                    {
                         "range": {   // 范围:
                              "fee": {
                                   "gt": 5   // 费用>5 ,gt的意思就是大于;
                              }
                         }
                    },
                    {
                         "term": {   // 条件:
                              "province": {
                                   "value": "上海"   // province 只能是”上海“
                              }
                         }
                    }

               ],
               "must_not": [

                    {
                         "match": {   // 匹配
                              "smsContent": "月"   // smsContent不能是”月“
                         }
                    }
               ]
          }
     }
}
11)filter 过滤查询:
filter一般和bool配合使用.

eg:

//  filter过滤查询:
POST /sms-logs-index/_search
{
     "query": {
          "bool": {
               "filter": [
                    {
                         "match": {  // 模糊匹配
                              "smsContent": "收货"   // smsContent字段值只能是“收货”,其他的过滤掉;
                         }
                    },
                    {
                         "term": {  // 精确匹配
                              "province": {
                                   "value": "上海"  // province字段只能是“上海”,其他的过滤掉。
                              }
                         }
                    }

               ]
          }
     }
}
12)prefix 前缀匹配查询
GET /library/books/_search
{
     "query":{
          "prefix":{
               "title":{  // 字段名:“title”
                    "value":"r"      // 匹配title字段里边的:r开头的数据;
               }
          }
     }
}
13)还有很多:
1> scroll查询. (深度分页)
使用scroll查询实现分页查询:
               es的分页,可以直接使用两个参数.
                         from和size -> 类似mysql中的limit ?,?
               注意: 一般要求,from和size加到一起不能大于1W.

	......
2)高亮查询:
	highlight
3)地图查询:(经纬度)
根据地图的经纬度查询具体的数据.
	1. 给定一个坐标,给定一个长度,以坐标为中心,画圆范围查询具体的内容
			geo_distance
	2. 给定两个坐标,通过两个坐标实现一个矩形查询具体内容
			geo_bounding_box
	3. 给定多个坐标,实现多边形,查询具体的内容.
			geo_polygon 
4)聚合查询:
聚合查询针对的是:用来进行统计数据; 
比如:
	1. cardinality根据每一个keyword字段统计出现条数(去重).
	2. range根据一个列的范围做统计.(应用对数值,时间类型,ip类型)
	3. sum、max、min、avg、count... 
14)根据条件删除数据:
删除只能根据id,进行删除....

eg:

//  wyh-apache-log是index索引, _delete_by_query是elasticsearch的删除指令
POST /wyh-apache-log/_delete_by_query         
{
     "query":{
          "match":{
               "num":"28"  //删除es中wyh-apache-log索引下的所有num=28的数据。
          }
     }
}

15)创建索引,并指定类型结构.
PUT /索引     // 增加一个索引,相当于数据库中的一个库
{
     "settings": {   // 设置
          "number_of_shards": 3,   // 指定分片数,默认是5
          "number_of_replicas": 1    // 指定备份数,默认是1
     }
}



PUT /索引/类型/_mappings   // 创建一个索引中的类型,相当于数据库中的某个库中的一个表
{
     "properties": {   // 通过"properties"来指定该类型有哪些列(字段),相当于指定数据库的表中有哪些字段
          字段名: {     // 字段名/列名
               "type": "类型"   // 字段名的类型
          },
          "字段名": {
               "type": "时间类型".
               "format": "格式化方式"    // 字段名的格式
          }
     }
}


GET /索引     // 查询某个索引
16)删除索引:
DELETE /qf
17)filter和must的区别:
在用es进行查数据的时候,filter和must都可以起到条件查询的效果,他俩有什么区别呢?
答:	
	must的性能要低一些,为什么?因为他要进行打分评估,也就是说要进行_score,而filter则不会。

举例:	
	一般来说,我是先使用filter把不需要的数据给过滤掉,例如:现在有一个电子商务的网站,我要查询一个category的id为1下面的所有产品,那么我首先会使用filter把category id等于1的产品过滤出来,也就是查出来,
	然后我在这个category下面查询name为“五子弥勒”的产品,这个时候我就会使用query,为什么呢,因为可能有的产品的name完全match 这个“五子弥勒”的关键字,但是有的产品可能只会match其中的一个字词,所以,如果我需要把有相似性的查出来,这个是query是具备这个功能的,
	因为query的本质不是筛选,而是查询,他会给结果打分,然后按照分数进行一个排序,如果命中的比较多,分数自然就很高,那么就会排在前面。那么这里存在一个打分的概念,我个人认为这个打分主要还是看分词器对他的命中程度,然后给一个评估。

	所以,这个时候,大家就应该知道filter和query的主要区别了,另外关于性能的我再提一下,elasticsearch中分为filter和query,所有的filter是不进行打分的,因为它只是一个筛选,对不感兴趣的直接筛选掉,所以它没必要对不感兴趣的东西进行一个打分,
	而query刚好相反,实际上你可以理解成,query它是一个命中率的概念,是一个率,所以打分是有必要的,另外作为一个搜索引擎,如果你不想看到打分,你可以通过参数去控制,但是实际上,对性能的提升并不大。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值