Elasticsearch 聚合查詢及複合查詢
集合查詢
sum聚合
sum是一個求累加值的聚合,其作用與關係型資料庫中相同。
GET /lib4/items/_search
{
"size": 0, //表示查詢多少條文件,聚合只需就和結果,輸出文件可以設定為0條
"aggs": {
"price_of_sum": { //自行取名作為結果集
"sum": {
"field": "price"
}
}
}
}
min聚合
min是一個求最小值的聚合,其作用與關係型資料庫中相同。
GET /lib4/items /_search
{
"size": 0,
"aggs": {
"price_of_min": {
"min": {
"field": "price"
}
}
}
}
max聚合
max是一個求最大值聚合,其作用與關係型資料庫中相同。
GET /lib4/items/_search
{
"size": 0,
"aggs": {
"price_of_max": {
"max": {
"field" : "price"
}
}
}
}
avg聚合
avg是一個求平均值的聚合,其作用與關係型資料庫中相同。
GET /lib4/items/_search
{
"size": 0,
"aggs": {
"price_of_avg": {
"avg": {
"field": "price"
}
}
}
}
cardinality聚合
cardinality是一個求基數的聚合,其作用與關係型資料庫中相同。
GET /lib4/items/_search
{
"size": 0,
"aggs": {
"price_of_cardi": {
"cardinality": { //其實相當於該欄位互不相同的值有多少類,輸出的是種類數
"field": "price"
}
}
}
}
terms聚合
terms是一個分組聚合,其作用與關係型資料庫中相同。
GET /lib4/items/_search
{
"size": 0,
"aggs": {
"price_of_by": {
"terms": {
"field": "price"
}
}
}
}
//對那些有唱歌興趣的使用者按年齡分組
GET /lib3/user/_search
{
"query": {
"match": {
"interests": "changge"
}
},
"size": 0,
"aggs": {
"agg_group_by": {
"field": "age",
"order": {
"avg_of_age": "desc"
}
},
"aggs": {
"avg_of_age": {
"age": {
"field": "age"
}
}
}
}
}
複合查詢
使用bool查詢
接受以下引數:
must:文件必須匹配設定條件才能被包含進來
must_not:文件必須不匹配設定條件才能被包含進來
should:如果滿足語句中的任意語句,將增加_source,否則,無任何影響。主要用於修正每個文件的相關性得分
filter:必須匹配,但以不評分、過濾模式來進行。這些語句對評分沒有貢獻,只是根據過濾標準來排除或包含文件
相關性得分是如何組合的?
每一個子查詢都獨自的計算文件的相關性得分,bool查詢將對計算出的等分進行合併,然後返回一個代表整個布林操作的等分。
下面的查詢用於查詢title欄位匹配 how to make millions 並且不被標識為 spam的文件。那些被標識為 starred 或在2014之後的文件,將比另外那些文件擁有更高的排名。如果 兩者 都滿足,那麼它的排名將更高。
GET /lib3/user/_search
{
"query": {
"bool": {
"must": {
"match": {
"interests": "changge"
}
},
"must_not": {
"match": {
"interests": "lvyou"
}
},
"should": [
{
"match": {
"address": "bei jing"
}
},
{
"range": {
"birthday": {
"gte": "1996-01-01"
}
}
}
]
}
}
}
如果沒有 must 語句,那麼至少需要能夠匹配其中的一條 should 語句。但如果存在至少一條 must 語句,則對 should 語句的匹配沒有要求。如果不想因為文件的時間影響得分,可以用 filter 語句來重寫前面的例子
//可以在bool內巢狀filter過濾
GET /lib3/user/_search
{
"query": {
"bool": {
"must": {
"match": {
"interests": "changge"
}
},
"must_not": {
"match": {
"interests": "lvyou"
}
},
"should": [
{
"match": {
"address": "bei jing"
}
}
],
"filter": {
"range": {
"birthday": {
"gte": "1996-01-01"
}
}
}
}
}
}
通過將 range 查詢移動到 filter 語句中,我們將它轉成不評分的查詢,將不在影響文件的相關性排名,由於它現在是一個不評分的查詢,可以使用各種對 filter 查詢有效的優化手段來提升效能。
bool 查詢本身也可以被用作不評分的查詢,簡單的將它放置到 filter 語句中並在內部構建布林邏輯
//在bool內巢狀fliter,在fliter下巢狀另一個bool作為過濾條件
GET /lib3/user/_search
{
"query": {
"bool": {
"must": {
"match": {
"interests": "changge"
}
},
"must_not": {
"match": {
"interests": "lvyou"
}
},
"should": [
{
"match": {
"address": "bei jing"
}
}
],
"filter": {
"bool": {
"must": [
{
"range": {
"birthday": {
"gte": "1990-01-01"
}
}
},
{
"range": {
"age": {
"lte": 30
}
}
}
],
"must_not": [
{
"term": {
"age": "29"
}
}
]
}
}
}
}
}
constant_score查詢
constant_score將一個不變的量評分應用於所有匹配的文件,被經常用於你只需要執行一個 fliter 而沒有其他查詢(例如:評分查詢)的情況下。
{
"constant_score": {
"filter": {
"term": {
"category": "ebooks"
}
}
}
}
//示例
GET /lib4/items/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"interests": "changge"
}
}
}
}
}
term 查詢被放置在constant_score中,轉成不評分的 filter。這種方式可以用來取代只有 filter 語句的 bool 查詢。