term的查询代表完全匹配,搜索之前不会对搜索的关键词进行分词。对关键字去文档分词库中匹配内容。
基本语法
# term查询
POST scs*/_search
{
"from": 0,
"size":5,
"query": {
"term": {
"type": {
"value": "1"
}
}
}
}
terms和term的查询机制是一样的,都不会对搜索的关键词进行分词。对关键字去文档分词库中匹配内容。
POST scs*/_search
{
"query": {
"terms": {
"customerCode.keyword": [
"ds",
"fc"
]
}
}
}
match 查询属于高层查询,他会根据你查询的字段类型不一样,采用不同的查询方式。 ·查询的是日期或者是数值的话,他会将你基于的字符串查询内容转换为日期或者数值对待。 ·如果查询的内容是一个不能被分词的内容((keyword ),matchi 查询不会对你指定的查询关键字进行分词。 ·如果查询的内容时一个可以被分词的内容(text),match 会将你指定的查询内容根据一定的方式去分词,去分词库中匹配指定的内容。 matchi 查询,实际底层就是多个term查询,将多个term查询的结果给你封装到了一起。
语法
POST /sms-log-index/sms-log-type/_search
{
"query":{
"match":{
"smsContent":"微信"
}
}
}
查询全部内容,不指定任何查询条件。
语法
POST /sms-log-index/sms-log-type/_search
{
"query":{
"match_all":{}
}
}
{
"query": {
"match": {
"smsContent": {
"query": "中国 健康",
"operator": "and"
}
}
}
}
match针对一个field做检索,multi-match针对多个field进行检索。
POST scs*/_search
{
"query": {
"multi_match": {
"query": "D",
"fields": ["stationCode","customerCode.keyword"]
}
}
}
GET scs1/_doc/1005558649YT5749518232238
查询语句
POST scs*/_search
{
"query": {
"ids": {
"values": ["57111859YT5568068260191","1005558649YT5749518232238"]
}
}
}
前缀查询
POST scs*/_search
{
"query": {
"prefix": {
"city": {
"value": "昆山"
}
}
}
}
模糊查询,根据输入的字符大概取匹配结果
POST scs*/_search
{
"query": {
"fuzzy": {
"city": {
"value": "昆山",
"prefix_length":2 ## 指定前面结果字符是不允许出现错误的
}
}
}
}
通配查询,和mysql的like查询一样,可以在字符串中指定通配符*和占位符?
POST scs*/_search
{
"query": {
"wildcard": {
"city": {
"value": "昆山*"
}
}
}
}
范围查找,gt:大于,lt:小于 e:等于。gte:>= lte:<=
POST scs*/_search
{
"query": {
"range": {
"fee": {
"gte": 1,
"lte": 5
}
}
}
}
正则查询,通过你编写的正则表达式去匹配内容。
PS:
prefix、fuzzy、wildcard和regexp查询效率相对比较低,要求要求高时,避免使用。
POST scs*/_search
{
"query": {
"regexp": {
"mobile":"180[0-9]{8}"
}
}
}
复合过滤器,将多个查询条件,以一定的逻辑组合在一起。
POST scs*/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"code": "00001"
}
}
],
"must_not": [
{"term": {
"deviceType": {
"value": "ZT"
}
}}
],
"should": [
{"term": {
"customerCode.keyword": {
"value": "fc"
}
}},
{"term": {
"customerCode.keyword": {
"value": "cn"
}
}}
]
}
}
}
查询可以帮助取影响查询后的score。
POST scs*/_search
{
"query": {
"boosting": {
"positive": {
"match": {
"customerCode.keyword": "DSD"
}
},
"negative": {
"match": {
"stationCode": "A000002498"
}
},
"negative_boost": 0.8
}
}
}
query:根据查询条件计算文档的匹配度得到一个分数,并且根据分数进行排序,不会做缓存的
filter:根据查询条件查询文档,不计算分数,且filter会对经常被过滤的数据进行缓存。
filter查询语句
POST scs*/_search
{
"query": {
"bool": {
"filter": [
{
"term": {
"customerCode.keyword": "cn"
}
},
{
"range": {
"opIncomeTime": {
"gte": 1635632000000,
"lte": 1648051199999
}
}
}
]
}
}
}
高亮查询是用户输入的关键字,以一定的特殊样式展示给用户。
高亮展现的数据,本身就是文档中的一个field,单独将field以highlight的样式返回给你。
es提供了一个highlight的属性,和query同级别的:
fragment_size:指定高亮数据展示多少字符回来。
pre_tags:指定前缀标签。
post_tags:指定后缀标签。
POST scs*/_search
{
"query": {
"bool": {
"filter": [
{
"term": {
"customerCode.keyword": "ds"
}
},
{
"range": {
"opIncomeTime": {
"gte": 1635632000000,
"lte": 1648051199999
}
}
}
]
}
},
"highlight": {
"fields": {
"customerCode":{}
},
"pre_tags": "",
"post_tags": "",
"fragment_size": 10
}
}
ES聚合查询和MySQL的聚合查询类型,ES的聚合查询相比MySQL要强大的多,ES提供的统计数据的方式多种多样。
POST /index/type/_search
{
"aggs":{
"名字":{
"agg_type":{
"属性":"值"
}
}
}
}
去重计数,即cardinality,第一步先将返回的文档中的一个指定的field进行去重,统计一共有多少条。
POST scs*/_search
{
"aggs": {
"agg": {
"cardinality": {
"field": "customerCode"
}
}
}
}
范围统计:统计一定范围出现的文档个数,比如针对某个field的值在0,-100,100-200之间分别是多少。
范围统计可以针对普通的数值、时间类型和ip类型等做出相应的统计。
POST scs*/_search
{
"aggs": {
"agg": {
"range": {
"field": "fee",
"ranges": [
{
"to": 5
},
{
"from": 5,
"to": 10
}
]
}
}
}
}
POST scs*/_search
{
"aggs": {
"agg": {
"date_range": {
"field": "createTime",
"format": "yyyy",
"ranges": [
{
"to": 2021
},
{
"from": 2021
}
]
}
}
}
}
POST scs*/_search
{
"aggs": {
"agg": {
"ip_range": {
"field": "ipAddr",
"ranges": [
{
"to": "10.7.1.10"
},
{
"from": "10.7.1.10"
}
]
}
}
}
}
查询指定field的最大值、最小值、平均值和平方和。
语法:
POST scs*/_search
{
"aggs": {
"agg":{
"extended_stats": {
"field": "stationCode"
}
}
}
}
{
"settings": {
"number_of_replicas": 3,
"number_of_shards": 5
},
"mappings": {
"properties": {
"name": {
"type": "text"
},
"location": {
"type": "geo_point"
}
}
}
}
PUT /map/_doc/1
{
"name":"天安门",
"location":
{
"lon":116.403981,
"lat":39.914492
}
}
PUT /map/_doc/2
{
"name":"海淀公园",
"location":
{
"lon":116.302509,
"lat":39.991152
}
}
PUT /map/_doc/3
{
"name":"北京动物园",
"location":
{
"lon":116.343184,
"lat":39.947468
}
}
geo_distance:直线距离检索,如给定点A,要求返回地图上距离点A三千米的商家(点外卖场景)
查找索引内距离3000米内的点
geo_distance涉及的参数如下
location:确定一个点;
distance:确定一个半径,单位米
distance_type:确定一个图形的类型,一般是圆形,arc
POST /map/_search
{
"query": {
"geo_distance":
{
"location":
{
"lon":116.433733
,"lat":39.908404
},
"distance":3000,
"distance_type":"arc"
}
}
}
geo_bounding_box:以两个点确定一个矩形,获取在矩形内的全部数据
geo_bounding_box涉及的参数如下
top_left: 左上角的矩形起始点经纬度;
bottom_right: 右下角的矩形结束点经纬度
POST /map/_search
{
"query": {
"geo_bounding_box": {
"location": {
"top_left": {
"lon": 116.326943,
"lat": 39.95499
},
"bottom_right": {
"lon": 116.433446,
"lat": 39.908737
}
}
}
}
}
geo_polygon涉及的参数如下
points:是个数组,存储多变形定点的经纬度,每个点用大括号包起来。
POST /map/_search
{
"query": {
"geo_polygon": {
"location": {
"points": [
{
"lon": 116.29561,
"lat": 39.976004
},
{
"lon": 116.364528,
"lat": 39.996348
},
{
"lon": 116.300209,
"lat": 40.003423
}
]
}
}
}
}