日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

02.组合查询

發布時間:2024/2/28 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 02.组合查询 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1.bool查詢
      • 1.1. 使用樣例
      • 1.2. filter的使用
    • 2. boost query
    • 3. constant score query
    • 4. disjunction max query
    • 5. function score
      • 5.1. score_mode boost_mode的含義
      • 5.2. function的類型
        • 1.script_score
        • 2.weight
        • 3.random_score
        • 4.field_value_factor
        • 5.decay functions: gauss, linear, exp
        • 6. 衰減函數支持

1.bool查詢

這個是用來組合查詢使用,可以使用下面4個條件

must
子句(查詢)必須出現在匹配的文檔中,并將有助于得分。

filter
子句(查詢)必須出現在匹配的文檔中。但是,與查詢分數不同的是,忽略該分數。 Filter子句在過濾器上下文中執行,這意味著計分被忽略,并且子句被考慮用于緩存。

should
子句(查詢)應出現在匹配的文檔中。

must_not
子句(查詢)不得出現在匹配的文檔中。子句在過filter context 中執行,這意味著計分被忽略,并且子句被視為用于緩存。由于計分被忽略,因此所有文檔的分數均返回0。

這個地方的minimum_should_match需要注意,他會對should起作用,但是默認值受整個bool查詢中的must,filter影響,如果你沒有明確指定minimum_should_match那么:

  • 當bool查詢中只有should查詢的話,則minimum_should_match的值是1
  • 如果還有must,filter查詢的話,則minimum_should_match的值為0,
  • 這個地方像是一個坑,所以一定要注意,在should和mustorfilter一起使用的話,盡量明確設置minimum_should_match,否則返回的結果可能并沒有命中should中的任何一個條件。

    bool查詢的score計算方式是 must和should查詢的score的和

    1.1. 使用樣例

    POST _search {"query": {"bool" : {"must" : {"term" : { "user" : "kimchy" }},"filter": {"term" : { "tag" : "tech" }},"must_not" : {"range" : {"age" : { "gte" : 10, "lte" : 20 }}},"should" : [{ "term" : { "tag" : "wow" } },{ "term" : { "tag" : "elasticsearch" } }],"minimum_should_match" : 1,"boost" : 1.0}} }

    1.2. filter的使用

    GET _search {"query": {"bool": {"filter": {"term": {"status": "active"}}}} }GET _search {"query": {"bool": {"must": {"match_all": {}},"filter": {"term": {"status": "active"}}}} }GET _search {"query": {"constant_score": {"filter": {"term": {"status": "active"}}}} }

    2. boost query

  • 返回匹配肯定查詢的文檔,同時降低也匹配否定查詢的文檔的相關性得分。
  • 您可以使用增強查詢來降級某些文檔,而不必將它們從搜索結果中排除。
  • GET /_search {"query": {"boosting" : {"positive" : {"term" : {"text" : "apple"}},"negative" : {"term" : {"text" : "pie tart fruit crumble tree"}},"negative_boost" : 0.5}} }

    positive:(必填)要運行的查詢。返回的所有文檔都必須與此查詢匹配。

    negative:(必填)查詢用于降低匹配文檔的相關性得分。
    如果返回的文檔與肯定查詢和該negative查詢匹配,文檔的最終相關性得分按照如下所示規則進行計算:

  • 從positive查詢中獲取原始的相關性分數。
  • 將分數乘以negative_boost值。
  • negative_boost:(必需,浮點數)0到1.0之間的浮點數,用于降低與否定查詢匹配的文檔的相關性得分。

    3. constant score query

    這個查詢一般包裹了一個filter context query,然后賦予每個文檔一個固定的相關性得分

    GET /_search {"query": {"constant_score" : {"filter" : {"term" : { "user" : "kimchy"}},"boost" : 1.2}} }

    4. disjunction max query

    可以翻譯為最相似最重要查詢

    返回與一個或多個包裝查詢(稱為查詢子句或子句)匹配的文檔。

    如果返回的文檔與多個查詢子句匹配,則dis_max查詢為該文檔計算的相關性得分=max(來自任何匹配子句的最高相關性得分)+tie*其他匹配的子查詢得分。

    您可以使用dis_max在用不同提升因子映射的字段中搜索術語。

    樣例

    GET /_search {"query": {"dis_max" : {"queries" : [{ "term" : { "title" : "Quick pets" }},{ "term" : { "body" : "Quick pets" }}],"tie_breaker" : 0.7}} }

    query

    (必需的查詢對象數組)包含一個或多個查詢子句。返回的文檔必須與這些查詢中的一個或多個匹配。如果一個文檔匹配多個查詢,Elasticsearch將使用最高的相關性得分。

    tie_breaker

    (可選,float)0到1.0之間的浮點數,用于增加與多個查詢子句匹配的文檔的相關性得分。默認為0.0。
    您可以使用tie_breaker值為多個字段中包含相同術語的文檔分配比僅在多個字段中最好的包含該術語的文檔更高的相關性分數,而不必將其與多個中兩個不同術語的更好的情況混淆領域。

    如果文檔與多個子句匹配,則dis_max查詢將計算該文檔的相關性得分,如下所示:

  • 從具有最高分數的匹配子句中獲取相關性分數。
  • 將來自其他任何匹配子句的得分乘以tie_breaker值。
  • 將最高分數加到相乘的分數上。
  • 如果tie_breaker值大于0.0,則所有匹配子句都計數,但是得分最高的子句計數最多。

    5. function score

    function_score允許您修改查詢檢索的文檔分數。例如,如果分數函數在計算上很昂貴,并且在過濾后的文檔集上計算分數也足夠使用了,則此功能很有用。

    要使用function_score,用戶必須定義一個查詢和一個或多個函數,這些函數為查詢返回的每個文檔計算一個新分數。

    function_score只能與以下一個函數一起使用:

    GET /_search {"query": {"function_score": {"query": { "match_all": {} },"boost": "5", # 針對整個query的boost乘數"random_score": {}, # 這個random_score就是預定義的一個function,es有幾個預定義的function,后面會講到"boost_mode":"multiply"}} }

    同時,還可以組合多個function 或者是對一些特殊的doc進行function score的計算

    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}} }

    上面的這些看不懂不要緊,后面會逐一解釋。

    首先,通過定義的function對每個文檔評分。參數score_mode指定如何組合計算出的分數:

    5.1. score_mode boost_mode的含義

    score_mode 和 boost_mode 含義一致,但是起作用的地方不一致,score_mode針對的是多個function計算出來的score如何最終計算出來這些function對應的score,
    boost_mode 針對的是如何將上一步計算的function計算的score和query查詢得到的score合并得到最終的query score

  • multiply: 多個score相乘
  • sum: 相加
  • avg: 求平均
  • first: 第一個function計算出來的score
  • max: 最大值
  • min: 最小值
  • ??因為score 可以在不同的范圍上(例如,衰減函數的分數在0到1之間,而field_value_factor則是任意的),并且由于有時希望函數對分數有不同的影響,因此每個函數的分數都可以由用戶定義weight。weight可以在函數數組(上面的示例)中為每個函數定義,并乘以各個函數計算出的分數。如果給定weight而沒有任何其他函數聲明,則weight充當僅返回weight的函數。

    如果將score_mode設置為avg,則各個分數將由加權平均值合并。例如,如果兩個function返回分數1和2,并且它們各自的weight分別為3和4,則它們的分數將合并為(1 * 3 + 2 * 4)/(3 + 4)而不是(1 * 3 + 2 * 4)/ 2。

    通過設置max_boost參數,可以將新score限制為不超過特定限制。 max_boost的默認值為FLT_MAX。

    新計算的分數與query score 合并。參數boost_mode定義如何合并:

  • multiply: query score and function score 相乘 multiplied (default),這個是默認設置
  • replace: 只使用function計算出來的score
  • sum: query score and function score are 相加 added
  • avg: average
  • max: max of query score and function score
  • min: min of query score and function score
  • 5.2. function的類型

    script_score
    weight
    random_score
    field_value_factor
    decay functions: gauss, linear, exp

    1.script_score

    script_score函數允許您包裝另一個查詢,并可以選擇使用腳本表達式從文檔中其他數字字段值派生的計算來自定義另一個查詢的評分。這是一個簡單的示例:

    GET /_search {"query": {"function_score": {"query": {"match": { "message": "elasticsearch" }},"script_score" : {"script" : {"source": "Math.log(2 + doc['likes'].value)"}}}} }

    在不同的腳本字段值和表達式之上,_score腳本參數可用于基于包裝的查詢來檢索分數。

    腳本編譯被緩存以加快執行速度。如果腳本具有需要考慮的參數,則最好重用相同的腳本并為其提供參數:

    GET /_search {"query": {"function_score": {"query": {"match": { "message": "elasticsearch" }},"script_score" : {"script" : {"params": {"a": 5,"b": 1.2},"source": "params.a / Math.pow(params.b, doc['likes'].value)"}}}} }

    請注意,與custom_score查詢不同,query的分數將與script評分的結果相乘。如果希望禁止這種情況,請設置“ boost_mode”:“ replace”

    2.weight

    weight分數使您可以將分數乘以提供的weight。有時可能需要這樣做,因為在特定查詢上設置的boost值會被標準化,而對于此得分函數則不會。數字值是float類型。

    3.random_score

    random_score生成的分數從0到1一直均勻分布,但不包括1。默認情況下,它使用內部Lucene doc id作為隨機性的來源,這非常有效,但不幸的是不可復現,因為文檔可能會通過合并重新編號。

    如果您希望分數是可復現的,則可以提供seed和field。然后將基于該seed,所考慮文檔的字段的最小值以及根據索引名稱和分片ID計算的salt來計算最終分數,以便獲得具有相同值但存儲在不同索引中的文檔不同的分數。請注意,位于相同分片中且具有相同字段值的文檔將獲得相同的分數,因此通常希望使用對所有文檔都具有唯一值的字段。最好的默認選擇是使用_seq_no字段,其唯一的缺點是,如果更新文檔,則分數會改變,因為更新操作也會更新_seq_no字段的值。

    可以在不設置字段的情況下設置種子,但這已被棄用,因為這需要在_id字段上加載字段數據,這會占用大量內存。

    GET /_search {"query": {"function_score": {"random_score": {"seed": 10,"field": "_seq_no"}}} }

    4.field_value_factor

    使用field_value_factor函數可以使用文檔中的字段來影響得分。與使用script_score函數類似,但是它避免了腳本編寫的開銷。如果用于多值字段,則在計算中僅使用該字段的第一個值。

    例如,假設您有一個用數字likes字段索引的文檔,并希望通過該字段影響文檔的分數,那么這樣做的示例如下所示:

    GET /_search {"query": {"function_score": {"field_value_factor": {"field": "likes","factor": 1.2,"modifier": "sqrt","missing": 1}}} }

    上面的查詢,對應的score會這樣計算score= sqrt(1.2 * doc[‘likes’].value)

    field: 計算score使用的field
    factor: 乘以field.value使用的系數,默認是1
    modifier: 計算方式score的方式
    missing: 沒有這個field的doc如何打分,這個是默認將field.value替換為missing

    modifier可以有以下幾種

  • none: 不會對字段值應用任何運算
  • log: 取字段值的常用對數以10為底的對數。因為此函數可能返回負值(0到1之間的值),則會導致錯誤,因此建議改用log1p。
  • log1p: 將1加至field.value值并取對數
  • log2p: 在字段值上加2并取公共對數
  • ln: 取字段值的自然對數。因為此函數將返回負值(0到1之間的值),會引起錯誤,所以建議改用ln1p。
  • ln1p: 將1加到欄位值并取自然對數
  • ln2p: 將2加到欄位值并取自然對數
  • square: 對字段值求平方(乘以它本身)
  • sqrt: 取字段值的平方根
  • reciprocal: 倒數,交換字段值,與1 / x相同,其中x是字段的值
  • 5.decay functions: gauss, linear, exp

    衰減函數
    衰減函數對文檔進行評分,該函數的衰減取決于文檔的數字字段值與用戶給定原點的距離。這類似于范圍查詢,但具有平滑的邊緣而不是框。
    要對具有數字字段的查詢使用距離評分,用戶必須為每個字段定義一個原點和一個小數位數。需要原點來定義從中計算距離的“中心點”,并需要標度來定義衰減率。衰減函數指定為

    "linear": { "FIELD_NAME": { "origin": "11, 12","scale": "2km","offset": "0km","decay": 0.33} }

    在上面的示例中,該字段是geo_point類型,并且可以以geo格式提供起點。在這種情況下,必須使用單位指定比例和偏移。如果您的字段是日期字段,則可以將比例和偏移量設置為天,周等。例:

    一個完整的樣例

    GET /_search {"query": {"function_score": {"gauss": {"date": {"origin": "2013-09-17", "scale": "10d","offset": "5d", "decay" : 0.5 }}}} }

    參數解析

    origin: 用于計算距離的原點。對于數字字段,參數必須為數字;對于日期字段,參數必須為日期;對于地理字段,必須指定為地理點。地理位置和數字字段必填。對于日期字段,默認值為現在。支持日期數學(例如now-1h)作為源。

    scale: 所有類型均必需。定義到原點的距離+偏移,計算出的分數將等于衰減參數。對于地理字段:可以定義為數字+單位(1km,12m,…)。默認單位是米。對于日期字段:可以定義為數字+單位(“ 1h”,“ 10d”,…。)。默認單位是毫秒。對于數字字段:任何數字。這個字段主要是配合decay使用,表示距離origin為scale的doc的衰減后的score應該為正常的decay定義的數值

    offset:
    如果定義了偏移量,則衰減函數將僅計算距離大于所定義偏移量的文檔的衰減函數。默認值為0。這個就是說距離origin在offset范圍內的值不進行衰減

    decay
    衰減參數定義了如何結合scale在距離上對文檔進行評分。如果未定義decay,則距離為scale的文檔將獲得0.5分。

    在第一個示例中,您的文檔可能代表酒店,并且包含地理位置字段。您要根據酒店距指定位置的距離來計算衰減函數。您可能不會立即看到為高斯功能選擇哪種比例,但是您可以說:“在距所需位置2公里的距離處,分數應降低到三分之一。”然后將自動調整參數“規?!?#xff0c;以確保得分函數為距所需位置2公里的酒店計算出0.33的得分。

    在第二個示例中,字段值在2013-09-12和2013-09-22之間的文檔的權重為1.0,從origin日期起15天的文檔的權重為0.5。

    6. 衰減函數支持

    這個有很多圖片,參考這里
    https://www.elastic.co/guide/en/elasticsearch/reference/7.2/query-dsl-function-score-query.html#_supported_decay_functions

    高斯衰減,線性衰減,exp衰減

    總結

    以上是生活随笔為你收集整理的02.组合查询的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。