1. 程式人生 > >elasticsearch Query DSL(三)

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

用於組合多個葉或化合物查詢子句,作為預設查詢 mustshouldmust_not,或filter條款。在mustshould 條款有他們的分數相結合-更匹配的條款,更好的-而must_notfilter條款在過濾器上下文中執行。

發生 描述

must

子句(查詢)必須出現在匹配的文件中,並有助於得分。

filter

子句(查詢)必須出現在匹配的文件中。但是不同於 must

查詢的分數將被忽略。過濾器子句在過濾器上下文中執行,這意味著忽略評分並考慮使用子句進行快取記憶體。

should

子句(查詢)應出現在匹配的文件中。如果 bool查詢位於查詢上下文中並且具有mustorfilter子句,則bool即使沒有 should查詢匹配,文件也將與查詢匹配。在這種情況下,這些條款僅用於影響分數。如果bool查詢是過濾器上下文, 或者既沒有must或者filter至少有一個should查詢必須與文件匹配,以便與bool查詢匹配。可以通過設定minimum_should_match引數來顯式控制此行為 。

must_not

子句(查詢)不得出現在匹配的文件中。子句在過濾器上下文中執行,這意味著忽略評分並考慮使用子句進行快取記憶體。由於忽略了評分,因此0會返回所有文件的分數。

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指定計算得分的組合方式:

multiply

分數乘以(預設)

sum

得分總和

avg

分數是平均的

first

應用具有匹配過濾器的第一個函式

max

使用最高分

min

使用最低分數

該引數boost_mode定義:

multiply

查詢得分和功能得分相乘(預設)

replace

僅使用功能得分,忽略查詢得分

sum

查詢得分和功能得分被新增

avg

平均

max

最大查詢分數和功能分數

min

最小查詢得分和功能得分

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

field

要從文件中提取的欄位。

factor

將欄位值乘以的可選因子,預設為1

modifier

修改適用於該欄位的值,可以是一個:nonelog, log1plog2plnln1pln2psquaresqrt,或reciprocal。預設為none

 

修改 含義

none

不要對欄位值應用任何乘數

log

取欄位值的常用對數

log1p

將1新增到欄位值並採用常用對數

log2p

將2新增到欄位值並採用常用對數

ln

取欄位值的自然對數

ln1p

將1新增到欄位值並採用自然對數

ln2p

將2新增到欄位值並採用自然對數

square

平方欄位值(乘以它自己)

sqrt

取欄位值的平方根

reciprocal

報答欄位值,同1/x那裡x是該欄位的值

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也有得分支援。支援的得分模式minmaxsumavgnone。預設值為 noneand,產生與先前版本相同的行為。如果將得分模式設定為除了之外的其他值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"
    }
  }
}

此查詢有兩個必需引數:

type

型別名稱,在指定的join領域

id

父文件的ID。

ignore_unmapped

設定為truethis時將忽略未對映,type並且不匹配此查詢的任何文件。在查詢可能具有不同對映的多個索引時,這非常有用。設定為false(預設值)時,如果type未對映,查詢將引發異常。