就像其他的很多語言一樣,我們可以給已有的變量取一個別名(alias)。即便是對高級語言一樣,比如我們定義不同的指針變量,指向同一個內存空間。這個有些類似別名的概念。
在Elasticsearch中,我們也可以為index中的一個字段(field)取一個另外的名字:
- 它可以用來代替搜索請求中的目標(target)字段
- 以及其它的被選定的API中
通常alias可以用來幫助我們重新命名一個字段,並讓這個字段的名稱符合我們的命名規則。我們可以參考ECS。通過alias的使用,可以使得我們的字段根據符合ECS標准。一個字段的alias只能有一個目標字段。
在使用alias時,字段別名的目標有一些限制:
- 它必須是一個具體的字段(不是一個對象或者是另外一個alias)
- 它必須在alias被創建時已經存在
- 如果是一個nested的對象,那么alias必須具有和它的目標具有同樣的nested scope
一個alias的應用例子
下面,我們來用一個具體的例子來說說明。我們首先來定義一個index的mapping如下:
PUT trips
{
"mappings": {
"properties": {
"distance": {
"type": "long"
},
"route_length_miles": {
"type": "alias",
"path": "distance"
},
"transit_mode": {
"type": "keyword"
}
}
}
}
現在我們輸入一下的兩個文檔,並搜索:
PUT trips/_doc/1
{
"distance": 100,
"transit_mode": "mode1"
}
PUT trips/_doc/2
{
"distance": 50,
"transit_mode": "mode2"
}
GET _search
{
"query": {
"range" : {
"route_length_miles" : {
"gte" : 60
}
}
}
}
顯示的結果是:
{
"took" : 346,
"timed_out" : false,
"_shards" : {
"total" : 20,
"successful" : 20,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "trips",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"distance" : 100,
"transit_mode" : "mode1"
}
}
]
}
}
從上面可以看出來,雖然我們沒有使用在source中的distance,但是我們使用它的別名route_length_miles,我們可以照樣把我們的統計數據搜索出來。
不被支持的API
不支持寫入字段別名:嘗試在索引或更新請求中使用別名將導致失敗。 同樣,別名不能用作copy_to的目標或多字段。
由於文檔源中不存在別名,因此在執行源過濾時不能使用別名。 例如,以下請求將返回_source的空結果:
- 不支持寫入字段別名:嘗試在索引或更新請求中使用別名將導致失敗。 同樣,別名不能用作copy_to的目標或多字段。
- 由於文檔源中不存在別名,因此在執行源過濾時不能使用別名。 例如,以下請求將返回_source的空結果: