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)