2014-12-03 89 views
1

我目前正試圖在elasticsearch中做一些幻想......並且它幾乎可以正常工作。Elasticsearch是通過「部分術語」而不是「整個術語」進行聚合

用例:我必須將每個特定字段的結果數量限制爲(x)個結果。

例如:在一組餐廳中,我只想返回每個餐廳名稱的兩個位置。如果我搜索墨西哥食品,那麼我應該得到(x)Taco Bell點擊,(x)Del Taco點擊和(x)El Torito點擊。

問題:我的聚合當前只匹配該詞的部分。

比如:如果我嘗試匹配company_name,它將爲塔科一個桶,另一桶,所以塔可鍾可能會在2桶露面,導致(x) * 2結果那家公司。

我很難相信這是理想的行爲。有沒有一種方法可以用整個搜索詞來聚合?

這裏是我當前聚合JSON:

"aggs": { 
    "by_company": { 
     "terms": { 
     "field": "company_name" 
     }, 
     "aggs": { 
     "first_hit": { 
      "top_hits": {"size":1, "from": 0} 
     } 
     } 
    } 
} 

您的幫助下,一如既往,非常感謝!

回答

2

是的。如果您的「company_name」只是標準分析器的常規字符串,或者您使用的任何「company_name」分析器都在分割名稱,那麼這就是您的答案。除非你告訴它,否則ES會存儲「術語」,而不是文字或整個文本。

假設您當前的分析儀在該領域的操作與上述相同,那麼您需要另一個 - 我們稱之爲「原始」 - 該字段應該反映您的company_name字段,但應該按原樣存儲公司名稱。

這就是我的意思是:

{ 
    "mappings": { 
    "test": { 
     "properties": { 
     ..., 
     "company_name": { 
      "type": "multi_field", 
      "fields": { 
      "company_name": { 
       "type": "string" #and whatever you currently have in your mapping for `company_name` 
      }, 
      "raw": { 
       "type": "string", 
       "index": "not_analyzed" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

而在你的查詢,你會做這樣的:

"aggs": { 
    "by_company": { 
     "terms": { 
     "field": "company_name.raw" 
     }, 
     "aggs": { 
     "first_hit": { 
      "top_hits": {"size":1, "from": 0} 
     } 
     } 
    } 
} 
+0

太謝謝你了!我甚至沒有測試過這個,但基於我已經瞭解的ES,我確信這是解決方案。你絕對幫助啓發我ES的工作方式,我應該已經知道,但沒有。 – 2014-12-03 19:03:42