2015-12-29 32 views
0

我想操縱我在彈性搜索上進行搜索時得到的分數。 我已經使用boost選項,但它不會給我我想要的結果。經過一些閱讀後,我認爲function_score查詢是解決我的問題。 我明白它是如何工作的,但我無法弄清楚如何改變我當前的查詢來將它與function_score查詢結合使用。在elasticsearch中操縱分數

"query": { 
"filtered": { 
    "query": { 
     "bool": { 
      "should": [{ 
       "multi_match": { 
        "type": "most_fields", 
        "query": "paus", 
        "operator": "and", 
        "boost": 2, 
        "fields": [ 
         "fullname^2", 
         "fullname.folded", 
         "alias^2", 
         "name^2" 
        ], 
        "fuzziness": 0 
       } 
      }, { 
       "multi_match": { 
        "type": "most_fields", 
        "query": "paus", 
        "operator": "and", 
        "boost": 1.9, 
        "fields": [ 
         "taggings.tag.name^1.9", 
         "function", 
         "relations.master.name^1.9", 
         "relations.master.first_name^1.9", 
         "relations.master.last_name^1.9", 
         "relations.slave.name^1.9", 
         "relations.slave.first_name^1.9", 
         "relations.slave.last_name^1.9" 
        ], 
        "fuzziness": 0 
       } 
      }, { 
       "multi_match": { 
        "type": "most_fields", 
        "query": "paus", 
        "operator": "and", 
        "fields": [ 
         "fullname", 
         "alias", 
         "name" 
        ], 
        "boost": 0.2, 
        "fuzziness": 1 
       } 
      }, { 
       "match": { 
        "extra": { 
         "query": "paus", 
         "fuzziness": 0, 
         "boost": 0.1 
        } 
       } 
      }] 
     } 
    }, 
    "filter": { 
     "bool": { 
      "must": [ 
       { 
        "terms": { 
         "type": ["Person"] 
        } 
       }, 
       { 
        "term": { 
         "deleted": false 
        } 
       } 
      ] 
     } 
    } 
} 

正如你所看到的,我們有四種匹配。

  • 升壓2:當有上的名字完全匹配
  • 加速1.9:當對引用的Tagging是準確的匹配
  • 加速0.2:當有在名稱但寫錯了一個字匹配
  • 提升0.1:當有額外的(說明)字段

我現在面臨的問題是,有一個字符比賽寫的不對,沒有標註的比賽成績比用火柴更高正確的標記和整個單詞寫錯了。這應該是其他方式...

任何幫助,將不勝感激:)

回答

1

沒有明確的答案。你最好的朋友是Explain API,它會告訴你如何計算每個文檔的score

最重要的是要記住的是boost只是計算得分時考慮的因素之一。從Docs

實際上,對於決定一個特定查詢子句的「正確」的增加值沒有簡單的公式。這是一個嘗試看的問題。請記住,提升是只是一個涉及相關性分數的因素;它具有與等因素來競爭

它會幫助你很多,如果你經歷TheoryLucene's Practical Scoring Function。這是Lucene使用的公式。

score(q,d) = 
      queryNorm(q) 
      · coord(q,d)  
      · ∑ (   
       tf(t in d) 
       · idf(t)²  
       · t.getBoost() 
       · norm(t,d)  
      ) (t in q) 

現在,人們的幾個原因你沒有得到預期的結果可能是norm(t,d)idf(t)²。例如,如果你有extra字段爲paus me和其他字段有類似我的名字是一些paus東西,那會給field length norm,即norm(t.d)更高的價值。此外,如果有說10000頁的文件,只有一個文件有PAUSextra領域,這將使逆文檔頻率相當高,因爲它的計算公式爲idf(t) = 1 + log (numDocs/(docFreq + 1))這裏numDocs=10000docFreq=1和該值將被平方。我的數據集中有這個問題。

模糊查詢得分較高可能與this issue有關,這基本上是Lucene Issue。這是在最新版本中修復的。

可能有效的一種方法是給constant_score最後兩個子句,並說前兩個子句的提升。 This將有助於理解。

試着一步步解決這個問題,從兩個條款開始,看到​​的輸出,然後嘗試三個,最後嘗試所有四個。還請刪除field boosting並僅嘗試query boost漸漸地你會弄清楚。

我希望這有助於!