2015-08-28 31 views
1

例如,我有索引pizzas。我有布爾過濾當使用基於自定義權重值過濾時,是否可以計數匹配數量?

"bool": { 
     "should": { 
      "toppings": [ 
      { 
       "query": "Tomatoes" 
      }, 
      { 
       "query": "Mushrooms" 
      } 
      ] 
     } 
     } 

能ElasticSearch爲索引的所有比薩餅返回匹配比例,因此所有具有mushrooms XOR tomatoes,將返回50%,如果兩個 - 100%。其他澆頭是無關緊要的。

如果是的話,我們可以用這種方式來擴展這個功能,所以我們可以爲每個頂級權重值添加。 例如我對番茄(50),蘑菇(75)和辣椒(100)感興趣。 所以總計它將是50 + 75 + 100 = 225 所以Margherita的西紅柿和Muchrooms = 125. 所以這個披薩配比應該返回接近56%(125/225)。

我讀了ElasticSearch指南,讀取了幾百次API文檔,嘗試過濾器,查詢,minimum_should_match,boost。我會非常感激至少有一些方向進一步搜索。

回答

0

我可以看到三種不同的方法來執行此

命名查詢

您可以使用named query在布爾,看看哪對每個文檔匹配的所有查詢。在客戶端,您可以計算每個頂點的值並自己找到總和。

功能得分查詢

{ 
    "query": { 
    "function_score": { 
     "filter": { 
     "terms": { 
      "toppings": [ 
      "Tomatoes", 
      "Mushrooms", 
      "chillies" 
      ] 
     } 
     }, 
     "functions": [ 
     { 
      "weight": 100, 
      "filter": { 
      "toppings": "chillies" 
      } 
     }, 
     { 
      "weight": 50, 
      "filter": { 
      "toppings": "Tomatoes" 
      } 
     }, 
     { 
      "weight": 75, 
      "filter": { 
      "toppings": "Mushrooms" 
      } 
     } 
     ], 
     "score_mode": "sum", 
     "boost_mode": "replace" 
    } 
    } 
} 

在具有任一辣椒或西紅柿或蘑菇上述文件將被匹配。無論過濾器是否存在,它都會創建一個提升值並添加它。所以功能給出的分數就是你正在尋找的總和。現在這被查詢分數取代。因此,文件的分數將是您要查找的數字。

腳本場方法

在這裏,你需要使用script field。這將創建一個額外的領域,每個文件計算你正在尋找使用腳本的總和

+0

謝謝你,Vineeth,你真的爲我節省了一天。我嘗試了第二種選擇,對函數語法做了小的改動,所以它對我來說就像一個魅力: 'weight「:110, 」filter「:{」term「:{」toppings「:」Tomatoes「 }} }' –

+0

哈,它是重量..讓我糾正它 –

相關問題