2017-02-24 44 views
0

我具有形式Elasticsearch骨料由字段前綴

{ 
    "id": "ABCxxx", 
    // Other fields 
} 

ABC是唯一標識符定義該記錄的「類型」的數據條目。 (例如,用戶將是USR1234...,圖像將是IMG1234...

我想獲得我ES中所有不同類型記錄的列表。所以本質上我想按id進行排序,但只查看id的前三個字符。

這不明明工作,因爲它按id(所以USR123不同於USR456):

{ 
    "fields": ["id"], 
    "aggs": { 
     "group_by_id": { 
      "terms": { 
       "field": "id" 
      } 
     } 
    } 
} 

我怎樣寫這個查詢?

回答

0

您可以使用無痛腳本語言來完成此任務。

{ 
    "fields": ["id"], 
    "aggs": { 
     "group_by_id": { 
      "terms": { 
       "script" : { 
        "inline": "doc['id'].substring(0,3)", 
        "lang": "painless" 
       } 
      } 
     } 
    } 
} 

更多信息here。請注意,子字符串方法的語法可能不完全正確。

+0

:(我的服務器不允許'script_lang不支持' – Kousha

+0

您使用的是哪個版本? – paqash

+0

您需要明確啓用腳本https://www.elastic.co/guide/en/elasticsearch/reference/current /modules-scripting.html#enable-dynamic-scripting – Rahul

1

正如paqash建議的那樣,已經可以通過腳本實現,但我建議在模式中將「type」另存爲一個不同的字段。

例如,

USR1234 : {id:"USR1234", type:"USR"} 
IMG1234 : {id:"USR1234", type:"IMG"} 

這樣可以避免腳本中不必要的複雜操作,並保持查詢界面的清潔。