2014-04-01 162 views
6

我在ES數據庫中有一堆公司數據。我正在計算每次發生的文檔數量,但我在聚合查詢中遇到了一些問題。我期望排除諸如「公司」或「公司」之類的術語。到目前爲止,我已經能夠按照以下代碼一次成功完成一個任期。Elasticsearch Aggregation Query with multiple excluded

{ 
    "aggs" : { 
     "companies" : { 
      "terms" : { 
       "field" : "Companies.name", 
       "exclude" : "corporation" 
      } 
     } 
    } 
} 

它返回

"aggregations": { 
    "assignee": { 
     "buckets": [ 
      { 
       "key": "inc", 
       "doc_count": 375 
      }, 
      { 
       "key": "company", 
       "doc_count": 252 
      } 
     ] 
    } 
} 

理想情況下,我想能夠做到像

{ 
    "aggs" : { 
     "companies" : { 
      "terms" : { 
       "field" : "Companies.name", 
       "exclude" : ["corporation", "inc.", "inc", "co", "company", "the", "industries", "incorporated", "international"], 
      } 
     } 
    } 
} 

但我一直沒能找到沒有辦法拋出一個錯誤

我已經看過ES文檔中Aggregation的「Terms」部分,只能找到一個ex足夠的一個排除。我想知道是否有可能排除多個術語,如果是的話,那麼這樣做的正確語法是什麼。

注意:我知道我可以將該字段設置爲「not_analyzed」,並獲取完整公司名稱的分組而不是拆分名稱。不過,我猶豫要做到這一點作爲分析允許鬥更加寬容名稱變更(即微軟公司&微軟公司)

+1

有關信息,這已被實現爲ES 1.5。有關詳細信息,請參閱此問題:https://github.com/elastic/elasticsearch/issues/11959 –

回答

10

exclude parameter is a regular expression的,所以你可以使用正則表達式,詳盡地列出了所有的選擇:

"exclude" : 
    "corporation|inc\\.|inc|co|company|the|industries|incorporated|international" 

這樣做通常需要轉義值(例如,.)。如果它不是一般生成的,那麼可以通過對其進行分組來簡化其中的一些(例如,inc\\.?覆蓋了inc\\.|inc,或者更復雜:co(mpany|rporation)?)。如果這將運行很多,那麼可能值得測試增加的複雜性如何影響性能。

也可以使用可選的flags,它們是Java Pattern中存在的選項。可能派上用場的是CASE_INSENSITIVE

"exclude" : { 
    "pattern" : "...expression as before...", 
    "flags" : "CASE_INSENSITIVE" 
}