1、領域特定語言(DSL)查詢
ES提供了基於JSON的DSL查詢,ES會將DSL查詢作爲AST查詢
1.1、葉子查詢子句
葉子查詢子句在特定字段上查找特定的值,例如match,term或者range查詢,這些查詢可以被自行使用;
1.2、複合查詢子句
複合查詢子句包裝其他葉子查詢或者複合查詢,並使用邏輯方式組合多個查詢(例如bool查詢或dis_max查詢),或者更改展現方式(例如constant_score查詢);
1.3、查詢代價比較高的查詢
不同的查詢因其實現方式的差異導致在執行速度上會有差異,同時會影響集羣的穩定性,查詢代價比較高的查詢可分爲以下幾類:
序號 | 字段及說明 | 上下文 |
---|---|---|
1 | 需要進行線性掃描以識別匹配項的查詢 | 腳本(script)查詢; |
2 | 首次代價比較高的查詢 | 模糊(fuzzy)查詢 |
正則(regexp)查詢 | ||
未設置index_prefixes參數的前綴(prefix)查詢 | ||
通配符(wildcard)查詢 | ||
3 | join查詢 | |
4 | 已過期的geo shape查詢 | |
5 | 查詢每個文檔代價比較高的查詢 | 腳本(script)查詢分數 |
過濾(percolate)查詢 |
tips:若不想以上耗時的查詢被執行,可以設置全局的參數:search.allow_expensive_queries爲false,默認爲true;
2、查詢上下文與過濾上下文
默認情況下ES會將查詢結果按照相似度分數(表示文檔與查詢內容的相似度)進行排序;
相似度分數在查詢結果中以_score字段表示,爲正浮點數;_score值越大表示文檔與查詢內容相似度越高;
相似度分數不僅與查詢類型有關,還與查詢子句有關(主要指查詢上下文與過濾上下文);
2.1、查詢上下文
查詢上下文中查詢子句回答’文檔與查詢子句的匹配程度’的問題,其不僅僅確定文檔是否匹配,還會計算相似度分數以_score字段來表示;
查詢子句在API調用中通過query參數傳遞到查詢上下文當中;
2.2、過濾上下文
過濾上下文中查詢子句回答’文檔與查詢子句是否匹配’,結果爲布爾類型且不會計算相似度分數;
過濾上下文主要用於過濾結構化的數據,例如:
1)、時間字段timestamp的值是否落在2020與2021之間;
2)、狀態字段status的值是否爲1;
使用頻率高的過濾子句過濾的結果將會被ES自動緩存,用於提高性能;
過濾子句在API調用中通過filter參數傳遞到過濾上下文當中,例如:布爾(bool)查詢中的filter或must_not參數,常數分(constant_score)查詢中的filter參數或者聚合filter查詢中;
查詢上下文與過濾上下文示例
GET _search
{
"query": {
"bool": {
"must": [
{
"match": {
"title": "Search"
}
},
{
"match": {
"content": "Elasticsearch"
}
}
],
"filter": [
{
"term": {
"status": 1
}
},
{
"range": {
"date": {
"gte": "2020-6-01"
}
}
}
]
}
}
}
查詢參數說明:
序號 | 字段及說明 | 上下文 |
---|---|---|
1 | title字段中必須包含search 字段 |
查詢上下文 |
2 | content字段中必須包含elasticsearch 字段 |
查詢上下文 |
3 | status字段值必須等於1 |
過濾上下文 |
4 | date字段值必須要大於2020-06-01 |
過濾上下文 |
tips:查詢上下文中相似度分數結果爲24位單精度數值,超過這個24位精度的數值將會被截斷;
3、複合查詢
複合查詢可以包裝其他複合查詢或葉子查詢,用於組裝其結果和分數,或用於更改其行爲,或從查詢上下文切換到過濾上下文;