专题系列—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它是一个命中率的概念,是一个率,所以打分是有必要的,另外作为一个搜索引擎,如果你不想看到打分,你可以通过参数去控制,但是实际上,对性能的提升并不大。