elasticsearch Query DSL(三)
本文參考官方提供api提煉出來的
https://www.elastic.co/guide/en/elasticsearch/reference/current/search.html
Compound Queries
複合查詢包裝其他複合或葉子查詢,以組合其結果和分數,更改其行為,或從查詢切換到篩選器上下文。
Constant Score Query
一個包裝另一個查詢的查詢,只返回一個等於篩選器中每個文件的查詢提升的常量分數。
GET /_search { "query": { "constant_score" : { "filter" : { "term" : { "user" : "kimchy"} }, "boost" : 1.2 } } }
Bool Query
用於組合多個葉或化合物查詢子句,作為預設查詢 must
,should
,must_not
,或filter
條款。在must
和should
條款有他們的分數相結合-更匹配的條款,更好的-而must_not
和filter
條款在過濾器上下文中執行。
發生 | 描述 |
---|---|
|
子句(查詢)必須出現在匹配的文件中,並有助於得分。 |
|
子句(查詢)必須出現在匹配的文件中。但是不同於 |
|
子句(查詢)應出現在匹配的文件中。如果 |
|
子句(查詢)不得出現在匹配的文件中。子句在過濾器上下文中執行,這意味著忽略評分並考慮使用子句進行快取記憶體。由於忽略了評分,因此 |
GET _search { "query": { "bool": { "must": { "match_all": {} }, "filter": { "term": { "status": "active" } } } } }
等價
GET _search { "query": { "constant_score": { "filter": { "term": { "status": "active" } } } } }
Dis Max Query
一個接受多個查詢的查詢,並返回與任何查詢子句匹配的任何文件。當bool
查詢組合來自所有匹配查詢的分數時,dis_max
查詢使用單個最佳匹配查詢子句的分數。
GET /_search { "query": { "dis_max" : { "tie_breaker" : 0.7, "boost" : 1.2, "queries" : [ { "term" : { "age" : 34 } }, { "term" : { "age" : 35 } } ] } } }
Function Score Query
function_score
允許你修改的由查詢檢索文件的分數。
要使用function_score
,使用者必須定義查詢和一個或多個函式,這些函式計算查詢返回的每個文件的新分數。
GET /_search { "query": { "function_score": { "query": { "match_all": {} }, "boost": "5", "random_score": {}, "boost_mode":"multiply" } } }
GET /_search { "query": { "function_score": { "query": { "match_all": {} }, "boost": "5", "functions": [ { "filter": { "match": { "test": "bar" } }, "random_score": {}, "weight": 23 }, { "filter": { "match": { "test": "cat" } }, "weight": 42 } ], "max_boost": 42, "score_mode": "max", "boost_mode": "multiply", "min_score" : 42 } } }
每個文件都由定義的函式評分。該引數 score_mode
指定計算得分的組合方式:
|
分數乘以(預設) |
|
得分總和 |
|
分數是平均的 |
|
應用具有匹配過濾器的第一個函式 |
|
使用最高分 |
|
使用最低分數 |
該引數boost_mode
定義:
|
查詢得分和功能得分相乘(預設) |
|
僅使用功能得分,忽略查詢得分 |
|
查詢得分和功能得分被新增 |
|
平均 |
|
最大查詢分數和功能分數 |
|
最小查詢得分和功能得分 |
script_score
函式允許您使用指令碼表示式包裝另一個查詢並使用從doc中其他數字欄位值派生的計算來自定義它的評分。
GET /_search { "query": { "function_score": { "query": { "match": { "message": "elasticsearch" } }, "script_score" : { "script" : { "source": "Math.log(2 + doc['likes'].value)" } } } } }
field_value_factor
功能允許您使用文件中的欄位來影響分數。它與使用該script_score
函式類似,但它避免了指令碼的開銷。如果在多值欄位上使用,則僅在計算中使用該欄位的第一個值。
GET /_search { "query": { "function_score": { "field_value_factor": { "field": "likes", "factor": 1.2, "modifier": "sqrt", "missing": 1 } } } }
這將轉化為以下評分公式:
sqrt(1.2 * doc['likes'].value)
該功能有多種選擇field_value_factor
:
|
要從文件中提取的欄位。 |
|
將欄位值乘以的可選因子,預設為 |
|
修改適用於該欄位的值,可以是一個: |
修改 | 含義 |
---|---|
|
不要對欄位值應用任何乘數 |
|
取欄位值的常用對數 |
|
將1新增到欄位值並採用常用對數 |
|
將2新增到欄位值並採用常用對數 |
|
取欄位值的自然對數 |
|
將1新增到欄位值並採用自然對數 |
|
將2新增到欄位值並採用自然對數 |
|
平方欄位值(乘以它自己) |
|
取欄位值的平方根 |
|
報答欄位值,同 |
missing
如果文件沒有該欄位,則使用的值。修飾符和因子仍然應用於它,就像從文件中讀取一樣。
Boosting Query
返回與positive
查詢匹配的文件,但減少與negative
查詢匹配的文件的分數。
GET /_search { "query": { "boosting" : { "positive" : { "term" : { "field1" : "value1" } }, "negative" : { "term" : { "field2" : "value2" } }, "negative_boost" : 0.2 } } }
Joining Queries
Nested Query
巢狀查詢允許查詢巢狀物件/文件
GET /_search { "query": { "nested" : { "path" : "obj1", "score_mode" : "avg", "query" : { "bool" : { "must" : [ { "match" : {"obj1.name" : "blue"} }, { "range" : {"obj1.count" : {"gt" : 5}} } ] } } } } }
Has Child Query
has_child
過濾器接受查詢和子型別針對其執行,並導致具有子文件與查詢匹配的父檔案。
GET /_search { "query": { "has_child" : { "type" : "blog_tag", "query" : { "term" : { "tag" : "something" } } } } }
has_child
也有得分支援。支援的得分模式min
,max
,sum
,avg
或none
。預設值為 none
and,產生與先前版本相同的行為。如果將得分模式設定為除了之外的其他值none
,則將所有匹配的子文件的得分聚合到關聯的父文件中。
GET /_search { "query": { "has_child" : { "type" : "blog_tag", "score_mode" : "min", "query" : { "term" : { "tag" : "something" } } } } }
Has Parent Query
該has_parent
查詢接受查詢和父型別。查詢在父文件空間中執行,該父文件空間由父型別指定。此查詢返回關聯父項已匹配的子文件。對於其餘has_parent
查詢具有相同的選項,其工作方式與has_child
查詢相同。
GET /_search { "query": { "has_parent" : { "parent_type" : "blog", "score" : true, "query" : { "term" : { "tag" : "something" } } } } }
Parent Id Query
parent_id
查詢可用於查詢屬於特定父級的子文件。
GET /my_index/_search { "query": { "parent_id": { "type": "my_child", "id": "1" } } }
此查詢有兩個必需引數:
|
該子型別名稱,在指定的 |
|
父文件的ID。 |
|
設定為 |