ElasticSearch花式查询

0.创建实体类与准备查询所用的索引

结构:
1)索引 sms-logs-index
2)类型 sms-logs-type
字段名称备注
createDate创建时间
sendDate发送时间
longCode发送的长号码
mobile手机号
corpName发送公司名称(需要分词检索)
smsContent下发短信内容(需要分词检索)
state下发短信状态(0为成功,1为失败)
operatorId运营商编号(1为移动,2位联通,3为电信)
province省份
ipAddr下发服务器ip地址
replyTotal短信状态报告返回时长(秒)
fee扣费(分)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.term & terms查询

1)term 查询是代表完全匹配,搜索之前不会对你搜索的关键字进行分词,直接拿关键字去文档分词库中匹配内容
POST /sms-logs-index/sms-logs-type/_search

在这里插入图片描述
在这里插入图片描述

2)terms查询和term机制一样,都不会将关键字进行分词,直接去分词库匹配,terms是针对一个字段包含多个值时使用
POST /sms-logs-index/sms-logs-type/_search
{
  "from": 0,
  "size": 5,
  "query": {
    "terms": {
      "province,keyword": [
        "北京"
      ]
    }
  }
}

在这里插入图片描述

在这里插入图片描述

2.match相关查询

1)match查询属于高层查询,根据查询字段类型不一样,采用不同的查询方式
实际底层就是多个term查询,将多个term查询结果封装到一起
查询一个不能被分词的内容(keyword),match查询不会对你指定的查询关键字进行分词
查询一个能被分词的内容(text),match将指定的查询内容根据一定的方式去分词,然后去分词库匹配
POST /sms-logs-index/sms-logs-type/_search
{
  "query": {
    "match": {
      "smsContent": "山"
    }
  }
}

在这里插入图片描述
在这里插入图片描述

2)match_all 查询全部内容,不指定查询条件
POST /sms-logs-index/sms-logs-type/_search
{
  "query": {
    "match_all": {}
  }
}

在这里插入图片描述
在这里插入图片描述

3)布尔match查询
POST /sms-logs-index/sms-logs-type/_search
{
  "query": {
    "match": {
      "smsContent":{
        "query": "中国 健康",
        "operator": "and"
      }
    }
  }
}

在这里插入图片描述
在这里插入图片描述

4)multiMatch针对多个field进行检索,多个field对应一个text
POST /sms-logs-index/sms-logs-type/_search
{
  "query": {
    "multi_match": {
      "query": "北京",
      "fields": ["province","smsContent"]
    }
  }
}

在这里插入图片描述

在这里插入图片描述

3.id & ids查询

1)id查询
GET /sms-logs-index/sms-logs-type/1

在这里插入图片描述
在这里插入图片描述

2)ids查询
POST /sms-logs-index/sms-logs-type/_search
{
  "query": {
    "ids": {
      "values": ["1","2"]
    }
  }
}

在这里插入图片描述
在这里插入图片描述

4.prefix查询

前缀查询,通过一个关键字去指定一个field的前缀,查询指定文档
POST /sms-logs-index/sms-logs-type/_search
{
  "query": {
   "prefix": {
     "corpName": {
       "value": "格力"
     }
   }
  }
}

在这里插入图片描述

在这里插入图片描述

5.fuzzy查询

模糊查询,ElasticSearch根据输入的大概内容匹配内容,查询结果不稳定
POST /sms-logs-index/sms-logs-type/_search
{
  "query": {
   "fuzzy": {
     "corpName": {
       "value": "格力汽车",
       "prefix_length": 2
     }
   }
  }
}

在这里插入图片描述
在这里插入图片描述

6.wildcard查询

通配查询,可以在查询时字符串指定通配符*与占位符?
POST /sms-logs-index/sms-logs-type/_search
{
  "query": {
   "wildcard": {
     "corpName": {
       "value": "中国*"
     }
   }
  }
}

在这里插入图片描述

在这里插入图片描述

7.rang查询

范围查询,只针对数值类型,对一个field进行大于或者小于的范围指定
POST /sms-logs-index/sms-logs-type/_search
{
  "query": {
   "range": {
     "fee": {
       "gt": 5,
       "lt": 10
     }
     }
   }
}

在这里插入图片描述
在这里插入图片描述

8.regexp查询

正则查询,编写正则表达式去匹配内容
POST /sms-logs-index/sms-logs-type/_search
{
  "query": {
   "regexp": {
     "mobile": "180[0-9] {8}"
   }
   }
}

在这里插入图片描述
在这里插入图片描述

9.delete-by-query

根据term,match等查询方式删除大量文档
注意:如果删除index下大部分数据,建议创建一个新的index,把保留的文档内容添加到其中
POST /sms-logs-index/sms-logs-type/_delete_by_query
{
  "query": {
   "range": {
     "fee": {
       "lt": 4
     }
     }
   }
}

在这里插入图片描述

在这里插入图片描述

10.filter查询

1)query:根据查询条件计算文档的匹配度得到分数,并根据分数排序(不做缓存)
2)filter:根据查询条件查询,不计算分数且filter会对经常被过滤的数据进行缓存
POST /sms-logs-index/sms-logs-type/_search
{
  "query": {
   "bool": {
     "filter": [
       {
         "term": {
           "corpName": "腾讯课堂"
         }
       },
       {
         "range": {
           "fee": {
             "lte": 4
           }
         }
       }
     ]
   }
  }
}

在这里插入图片描述
在这里插入图片描述

11.高亮查询

高亮展示的数据本身是文档中的field,单独将field以hightlight形式返回
1)fragment_size:指定高亮数据返回的字符个数
2)pre_tags:指定前缀标签
3)post_tags:指定后缀标签
POST /sms-logs-index/sms-logs-type/_search
{
  "query": {
    "match": {
      "smsContent": "腾讯课堂"
    }
  },
  "highlight": {
    "fields": {
      "smsContent": {}
    },
    "pre_tags": "<font color='red'>",
    "post_tags": "</font>",
    "fragment_size": "10"
  }
}

在这里插入图片描述

在这里插入图片描述

12.复合查询

复合过滤器,将多个查询条件,用逻辑组合起来
1)must:所有条件组合在一起,类似and的意思
2)must_not:将使用must_not的条件全部不匹配,类似not的意思
3)should:所有条件用should组合在一起,类似or的意思
POST /sms-logs-index/sms-logs-type/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "province": {
              "value": "北京"
            }
          }
        },
        {
          "term": {
            "province": {
              "value": "上海"
            }
          }
        } 
      ],
       "must_not": [
        {
          "term": {
            "operatorId": {
              "value": "2"
            }
          }
        }
      ],
      "must": [
        {
          "match": {
            "smsContent": "呼吸"
          }
        },
        {
           "match": {
            "smsContent": "大陆"
        }
        }
      ]
    }
  }
}

在这里插入图片描述
在这里插入图片描述

boosting查询(影响查询后的score)
1)positive:匹配positive的查询内容才会返回到结果集
2)negative:匹配positive和negative,可以降低文档的score
3)negative_boost:指定系数(必须小于1.0)
查询时分数计算:
1)搜索关键字在文档出现的频次高,则分数高
2)指定的文档内容越短,分数越高
3)指定的关键字被分词的内容被分词库匹配的个数越多,则越高
POST /sms-logs-index/sms-logs-type/_search
{
  "query": {
    "boosting": {
      "positive": {
        "match": {
          "smsContent": "xxxxx"
        }
      }, "negative": {
        "match": {
          "smsContent": "xxxx"
        }
      },
      "negative_boost": 0.5
    }
  }
}

在这里插入图片描述

在这里插入图片描述

13.深分页scroll

POST /sms-logs-index/sms-logs-type/_search?scroll=1m
{
  "query": {
    "match_all": {}
  },
  "size": 2,
  "sort": [
    {
      "fee": {
        "order": "desc"
      }
    }
  ]
}

POST /_search/scroll
{
  "scroll_id": "<根据第一步得到的scroll_id去指定>",
  "scroll": "<scroll信息的生存时间>"
}

DELETE /_search/scroll/scroll_id
from+size (两者之和不能超1w)
1)将用户指定的关键字进行分词
2)将词汇去分词库中检索,得到多个文档id
3)去各个分片拉取数据
4)根据score将数据进行排序
5)根据from+size的值,丢弃部分数据
6)返回结果
scroll+size(不适合实时查询)
1)将用户指定的关键字进行分词
2)将词汇去分词库中检索,得到多个文档id
3)将文档id放在一个上下文中
4)根据指定size去ElasticSearch中检索指定个数数据,拿完数据文档id(会从上下文移除)
5)如需下一页数据,直接去ElasticSearch上下文找后续内容
6)循环 4)和 5)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值