Elasticsearch(基于7.17)
1.SearchApi
ES支持两种基本方式检索:
-
通过使用 REST request URI 发送搜索参数(uri+检索参数)
GET bank/_search?q=*&sort=account_number:asc
-
通过使用Rest resuest body 发送搜索参数(uri+请求体)
GET bank/_search
{
"query":{
"match_all":{}
},
"sort":[
{
"account_number" :{
"order" : "desc"
}
}
]
}
2.检索
2.1分词匹配
即查询关键词
GET bank/_search
{
"query":{
"match": {
"account_number": "20"
}
}
}
2.2短语匹配
即匹配一整句
GET bank/_search
{
"query":{
"match_phrase": {
"address": "mill road"
}
}
}
2.3多字段匹配
GET bank/_search
{
"query":{
"multi_match": {
"query": "mill",
"fields": ["state","address"]
}
}
2.4bool复合查询
如must,must_not,should,should可以提高评分
GET bank/_search
{
"query":{
"bool": {
"must": [
{"match": {
"gender": "M"
}},
{"match": {
"address": "mill"
}}
]
}
}
}
2.5 结果过滤filter
filter不计算评分
GET bank/_search
{
"query":{
"bool": {
"must": [
{"match": {
"gender": "M"
}},
{"match": {
"address": "mill"
}}
],
"filter": [
{
"range": {
"age": {
"gte": 18,
"lte": 30
}
}
}
]
}
}
}
2.6term查询
term和match的区别是term不分词,适合精确查找
- 非文本字段都使用term
- 文本字段都使用match
2.7match_phrase和match keyword的区别
match_phrase为短语匹配,只要包含字段都能匹配,而match keyword则要求字段完全一致才能匹配
2.8 执行聚合
聚合提供了从数据中分组和提取数据的能力。最简单的聚合方法大致等于SQL GROUPBY和SQL聚合函数。在 Elasticsearch中,您有执行搜索返回hits(命中结果),并且同时返回聚合结果,把一个响应中的所有 hits (命中结果)分隔开的能力。这是非常强大且有效的,您可以执行查询和多个聚合,并且在一次使用中得到各自的(任何一个的)返回结果,使用一次简洁和简化的API来避免网络往返。
简单聚合
aggs:执行聚合,语法如下
GET bank/_search
{
"query": {
"match": {
"address": "mill"
}
},
"aggs": {
"ageAgg": {
"terms": {
"field": "age",
"size": 10
}
},
"ageAvg":{
"avg": {
"field": "age"
}
},
"balanceAvg":{
"avg": {
"field": "balance"
}
}
}
}
size:0 不显示搜索数据
复杂聚合(子聚合)
GET bank/_search
{
"query": {
"match_all": {}
},
"size": 0,
"aggs": {
"ageAgg": {
"terms": {
"field": "age",
"size": 100
},
"aggs": {
"ageAvg": {
"avg": {
"field": "balance"
}
},
"genderAgg": {
"terms": {
"field": "gender.keyword"
},
"aggs": {
"numavg": {
"avg": {
"field": "balance"
}
}
}
}
}
}
}
}