簡體   English   中英

如何在彈性搜索函數得分中提高字段長度范數?

[英]How can I boost the field length norm in elasticsearch function score?

我知道,彈性搜索在計算查詢檢索到的文檔的分數時會考慮字段的長度。 場越短,重量越大(參見場長標准 )。

我喜歡這種行為:當我搜索iphone我對iphone 6比對Crappy accessories for: iphone 5 iphone 5s iphone 6更感興趣Crappy accessories for: iphone 5 iphone 5s iphone 6

現在,我想嘗試提升這些東西,讓我們說我想要加倍它的重要性。

我知道可以使用功能分數修改分數 ,我想我可以通過腳本分數達到我想要的效果。

我試圖在這個分數中添加另一個字段長度范數:

    {
     "query": {
       "function_score": {
         "boost_mode": "replace",
         "query": {...},
         "script_score": {
             "script": "_score + norm(doc)"
         }
       }
     }
   }

但是我失敗了,得到了這個錯誤: [No parser for element [function_score]]

編輯:

我的第一個錯誤是我沒有將功能分數包裝在“查詢”中。 現在我編輯了上面的代碼。 我的新錯誤說

GroovyScriptExecutionException[MissingMethodException
[No signature of method: Script5.norm() is applicable for argument types:
(org.elasticsearch.search.lookup.DocLookup) values: 
[<org.elasticsearch.search.lookup.DocLookup@2c935f6f>]
Possible solutions: notify(), wait(), run(), run(), dump(), any()]]

編輯:我提供了第一個答案,但我希望有一個更好的答案

看起來你可以使用token_count類型的字段和field_value_factor函數得分來實現

所以,在字段映射中這樣的事情:

"name": { 
  "type": "string",
  "fields": {
    "length": { 
      "type":     "token_count",
      "analyzer": "standard"
    }
  }
}

這將使用該字段中的令牌數。 如果要使用字符數,可以將分析器從standard更改為標記每個字符的自定義分析器。

然后在查詢中:

"function_score": {
  ...,
  "field_value_factor": {
    "field": "name.length",
    "modifier": "reciprocal"
  }
}

我有一些有用的東西。 通過以下內容,我從分數中扣除了我感興趣的字段的長度。

{
 "query": {
   "function_score": {
     "boost_mode": "replace",
     "query": {...},
     "script_score": {
         "script": "_score  - doc['<field_name>'].value.length()"
     }
   }
 }
}

Hovever,我無法控制這個數字的相對權重我減去,與舊的分數相比。 這就是為什么我不接受我的答案:我會暫時等待更好的答案。 理想情況下,我希望有一種方法可以訪問script_score字段長度范數函數,或者獲得相同的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM