ES領域特定語言(DSL)查詢_9

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、複合查詢

複合查詢可以包裝其他複合查詢或葉子查詢,用於組裝其結果和分數,或用於更改其行爲,或從查詢上下文切換到過濾上下文;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章