2014-09-05 28 views
6

Elasticsearch的新功能。我有興趣只返回最相關的文檔,並遇到min_score。他們說:「注意,大多數時候,這沒有多大意義」,但沒有提供理由。那麼,爲什麼使用min_score沒有意義?爲什麼不在elasticsearch中使用min_score?

編輯:我真正想要做的只是返回文檔比x高「得分」。我有這個:

data = { 
     'min_score': 0.9, 
     'query': { 
      'match': {'field': 'michael brown'}, 
     } 
    } 

是否有更好的選擇,以便它只返回最相關的文檔?

thx!

編輯#2: 我使用minimum_should_match並返回一個400錯誤:

"error": "SearchPhaseExecutionException[Failed to execute phase [query], all shards failed;" 

data = { 
     'query': { 
      'match': {'keywords': 'michael brown'}, 
      'minimum_should_match': '90%', 
     } 
    } 
+0

除非您自己計算結果的分數,否則它們不是非常有用,即使它們可能需要由您完全控制。儘管使用得分提升,但我從來沒有使用過min_score,因爲我從不關心最低分與最低分應該相匹配。我只使用分數排序和前n搜索 – coffeeaddict 2014-09-05 15:35:03

+0

我也嘗試使用minimum_should_match,但它返回「400」狀態。我已經更新了我的問題。 – 2014-09-05 19:08:20

+0

你怎麼使用minimum_should_match?關於min_score的事情是0.9是什麼意思?你如何根據分數定義了「足夠好」(除非你使用增強/函數生成該得分) – coffeeaddict 2014-09-05 21:51:17

回答

4

我用min_score相當多的努力發現是一個明確的匹配一組給定文件輸入數據 - 用於生成查詢。

當然,您爲文檔獲得的分數取決於查詢。所以我會說在許多組合中嘗試你的查詢(例如不同的關鍵字),並決定哪個文檔是第一個你寧願沒有返回的文檔,並記下他們的每個分數。如果分數相似,這會給你一個很好的猜測值,用於你的最低分數。

但是,您需要記住,分數不僅僅取決於查詢和返回的文檔,它會考慮所有其他文檔具有您要查詢的字段的數據。這意味着如果您使用20個文檔的索引測試min_score值,那麼當您在生產索引上嘗試使用例如幾千或更多文檔時,該分數可能會發生很大變化。這種改變可能會發生,並不容易預測。

我發現我的匹配使用min_score,您需要創建一個相當複雜的查詢,並設置分析器來調整查詢各個組件的分數。但是,什麼是和不包括對我的應用程序是至關重要的,所以當保持簡單時,您可能很滿意它爲您提供的內容。

2

我不知道這是最好的解決辦法,但對我的作品(JAVA):

// "tiny" search to discover maxScore 
// it is fast, because it returns only 1 item 
SearchResponse response = client.prepareSearch(INDEX_NAME) 
         .setTypes(TYPE_NAME) 
         .setQuery(queryBuilder) 
         .setSize(1) 
         .execute() 
         .actionGet(); 

// get the maxScore and 
// and set minScore = 70% 
float maxScore = response.getHits().maxScore(); 
float minScore = maxScore * 0.7; 

// second round with minimum score 
SearchResponse response = client.prepareSearch(INDEX_NAME) 
         .setTypes(TYPE_NAME) 
         .setQuery(queryBuilder) 
         .setMinScore(minScore) 
         .execute() 
         .actionGet(); 

我搜索了兩次,但第一次它的速度快,因爲它返回只有1項,那麼我們可以得到max_score

注意:minimum_should_match工作不同。如果您有4個查詢,並且您說minimum_should_match = 70%,這並不意味着item.score應該> 70%。這意味着該項目應該與70%的查詢匹配,即至少3/4查詢

相關問題