2016-12-29 68 views
0

我想要的是在標題字段中獲取與查詢字詞匹配的所有文檔,並且如果查詢字詞也完全匹配,則通過嵌套對象中字段的值提高分數嵌套字段。將父文檔_score和函數_score乘以嵌套查詢

以下是我的榜樣DOC:

{ 
    "Title": "The Heart of the Elastic Stack" 
    "QueryClicks": [ 
     { "Term": "elastic stack", "Count": 100}, 
     { "Term": "elastic", "Count": 50}, 
     { "Term": "hard of the elastic", "Count": 200}, 
    ] 
} 

而且例如查詢DSL:

{ 
    "query" : { 
    "bool" : { 
     "must" : [{ 
      "match" : { 
      "Title" : "elastic stack" 
      } 
     } 
     ], 
     "should" : [{ 
      "nested" : { 
      "path" : "QueryClicks", 
      "query" : { 
       "function_score" : { 
       "query" : { 
        "match" : { 
        "QueryClicks.Term.lowercaseraw" : "elastic stack" 
        } 
       }, 
       "functions" : [{ 
        "script_score" : { 
         "script" : "log(doc['QueryClicks.Count'].value*4)" 
        } 
        } 
       ], 
       "boost_mode" : "replace" 
       } 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

這多少工作,對於某些queryterm,如果匹配QueryClicks.Term之一,額外的分數將被添加到文檔的整個分數。

但並不完美,我想要的是將嵌套的函數分數(即log(doc ['QueryClicks.Count']。value * 4))與在must子句中計算的父文檔的分數相乘。

如果我能得到父文檔的得分,那麼我就可以做這樣的事情:

「腳本」: 「日誌(DOC [ 'QueryClicks.Count']值* 4)* _parent_score」

但是,由於ES不支持從嵌套查詢獲取父分數。任何其他方法?

目的是將QueryQuerys.Count計算出的_score和must查詢子句中的_score相乘。

+0

爲了乘以功能得分與查詢得分boost_mode應該相乘。 – user3775217

回答

0

您已經使用boost_mode作爲替換。這會忽略查詢生成的分數。您當前的功能分數設置將僅替換score of function查詢的文檔分數。

爲了繁衍功能查詢雙方比分和進球由查詢生成使用以下查詢

{ 
    "query": { 
     "bool": { 
      "must": [{ 
       "match": { 
        "Title": "elastic stack" 
       } 
      }], 
      "should": [{ 
       "nested": { 
        "path": "QueryClicks", 
        "query": { 
         "function_score": { 
          "query": { 
           "match": { 
            "QueryClicks.Term.lowercaseraw": "elastic stack" 
           } 
          }, 
          "functions": [{ 
           "script_score": { 
            "script": "log(doc['QueryClicks.Count'].value*4)" 
           } 
          }], 
          "boost_mode": "multiply", 
          "score_mode": "sum" 
         } 
        } 
       } 
      }] 
     } 
    } 
} 

在這裏,您可以相應地更換score_mode要如何爲每個得分函數內部評價功能評分。

希望這對你有用。 謝謝

+0

謝謝,但這不是我想要的。在「function_score」子句中將「boost_mode」更改爲乘,只需將script_score中的分數與function_score的**嵌套**匹配查詢中的分數相乘即可。然後添加到來自父查詢的分數。我想要的是,將來自script_score的分數與來自** parent **查詢的分數相乘。 – Youxu

+0

ok.first首先score_mode是用於組合函數數組內所有函數的分數。 boost_mode用於將函數的得分與查詢得分相結合。現在你說你想從script_score得分(意思是你想忽略嵌套得分)。函數得分只考慮函數數組中的得分,函數得分內的查詢只是將文檔過濾到子函數來應用。在ES文檔中非常清楚地提到「新計算得分與查詢得分相結合,參數boost_mode定義瞭如何:」。所以我認爲這幾乎可以解決你所說的問題 – user3775217

+0

也請附上查詢解釋,看看分數如何爲你工作。您可以使用額外的查詢參數拍攝查詢,如「POST play1/_search?explain」。請粘貼輸出 – user3775217

0

謝謝。 我以前的評論沒有清楚回答你的問題。我試圖解釋更多的細節。 你是對的,score_mode是用於將所有功能的得分合併到函數陣列中,boost_mode用於合併功能得分和查詢得分

而我想要的是:

  1. 乘父文檔的得分和嵌套文檔的得分。
  2. 父文檔得分來自{match:{「Title」:「elastic stack」}} in must clause。
  3. 嵌套文檔分數是通過嵌套文檔字段QueryClicks.Count來計算的,該文檔字段被封裝在應該子句中的嵌套查詢中的function_score中。

所以,在我原來的查詢DSL,我設置boost_mode到「替換」,怎麼把比分我想在應該條款實際上是得分從下面的腳本:

"script": "log(doc['QueryClicks.Count'].value*4)" 

但因爲它在應該是條款,所以它會加到必須條款的分數上。正如我所說,我希望它是從得分乘以條款。

如果改變「boost_mode」爲「正片疊底」如你所說,劇本分數將乘以從嵌套比賽的比分: 「匹配」:{「QueryClicks.Term.lowercaseraw」:「彈性堆棧「}

相關的查詢(‘匹配’:{」 QueryClicks.Term.lowercaseraw「:‘彈性堆’})上述script_score的是使用腳本得分只是的前提條件。

然後將此分數加到必須條款的分數上。這不是我想要的。

希望這可以幫助你理解我的要求。