1. 程式人生 > >Elasticsearch 聚合查詢及複合查詢

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 查詢。