2015-10-16 82 views
0

我有一個使用期限聚合的elasticsearch查詢:期限彙總值

{ 
    "query" : { 
     "match_all" : {}       
    }, 
    "aggregations" : { 
     "tag" : { 
      "terms" : { 
       "field": "persona"  
      } 
     } 
    } 
} 

查詢的結果打了一個樣品的_source樣子:

"_source": { 
    "facets": { 
     "persona": "research manager", 
     "research type": "qualitative" 
    }, 
    "name": "Joe Doe" 
} 

聚集桶的樣子:

"facets": { 
    "tag": { 
     "_type": "terms", 
     "missing": 0, 
     "other": 0, 
     "terms": [ 
      { 
       "count": 2, 
       "term": "research" 
      }, 
      { 
       "count": 2, 
       "term": "manager" 
      } 
     ], 
     "total": 4 
    } 
} 

術語聚合是考慮人物角色字段中的詞語而不是字段的整個值。這裏是預期的輸出:

... 
"terms" : [ 
     { 
     "term" : "research manager", 
     "count" : 2 
     }, 
     ... 
] 
.... 

我做錯了什麼?有沒有辦法做到這一點?

+0

我剛剛注意到Elasticsearch記錄中出現了一些奇怪的現象......角色在facet對象中。我們可以看到這個映射嗎? – eemp

回答

4

正如bittusarkar提到的,角色字段最有可能被分析。如果您沒有在映射中指定映射或有關該字段的信息,那麼它將被Elasticsearch動態添加到映射中,類型爲string,缺省值爲Standard Analyzer。分析器結合了標準分詞器,它比空白分詞器多一點,但基本上你的字段的內容被視爲一個「袋子文字」。

通常,對於全文搜索/ Elasticsearch查詢,您希望分析內容,以便在搜索「管理員」時匹配「研究經理」。

一個解決方案是使用multi-fields。你映射的有關人物領域的一個片段可能會是這樣的:

"persona": { 
    "type": "multi_field", 
    "fields": { 
     "persona": { "type": "string" }, 
     "raw": { "type": "string", "index": "not_analyzed" } 
    } 
} 

這樣,你可以做搜索,如:

{ 
    "query" : { 
     "match" : { 
      "persona" : "Managers" 
     } 
    } 
} 

,並在同一時間,你可以使用聚合:

{ 
    "query" : { 
     "match_all" : {} 
    }, 
    "aggregations" : { 
     "tag" : { 
      "terms" : { 
       "field": "persona.raw"  
      } 
     } 
    } 
} 

請注意,對於術語聚合,您正在使用persona.raw而不是persona

1

很可能是該領域的「角色」進行了分析。映射「樣本」的定義應該確認它。 Terms aggregation適用於未分析的字段。如果分析字段「角色」,則將其作爲兩個不同的詞「研究」和「經理」保存在索引中。爲了得到你想要的,你必須將字段「角色」改爲未分析。有關更多信息,請參閱this。恐怕您無法動態地在您的映射中進行此更改。您需要使用更新的映射爲所有文檔重新編制索引,以使更改生效。