就像其他的很多语言一样,我们可以给已有的变量取一个别名(alias)。即便是对高级语言一样,比如我们定义不同的指针变量,指向同一个内存空间。这个有些类似别名的概念。
在 Elasticsearch 中,我们也可以为 index 中的一个字段(field)取一个另外的名字:
- 它可以用来代替搜索请求中的目标(target)字段
- 以及其它的被选定的 API 中
通常 alias 可以用来帮助我们重新命名一个字段,并让这个字段的名称符合我们的命名规则。我们可以参考 ECS。通过alias的使用,可以使得我们的字段根据符合 ECS 标准。一个字段的 alias 只能有一个目标字段。
在使用 alias 时,字段别名的目标有一些限制:
- 它必须是一个具体的字段(不是一个对象或者是另外一个 alias)
- 它必须在 alias 被创建时已经存在
- 如果是一个 nested 的对象,那么 alias 必须具有和它的目标具有同样的 nested scope
例子 一
下面,我们来用一个具体的例子来说说明。我们首先来定义一个 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,我们可以照样把我们的统计数据搜索出来。
例子 二
我们定义如下的一个 mapping:
PUT logs_server
{
"mappings": {
"properties": {
"http": {
"properties": {
"request": {
"properties": {
"method": {
"type": "alias",
"path": "method.keyword"
}
}
}
}
},
"method": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
在上面,我们定义了两个字段,其中的一个字段是 alias:
- method.keyword
- http.request.method
其中 http.request.method 被定义为 alias 指向 method.keyword。运行上面的指令,并执行如下的操作:
PUT logs_server/_doc/1
{
"method": "GET"
}
我们可以通过如的方法来进行搜索:
GET logs_server/_search
{
"query": {
"match": {
"http.request.method": "GET"
}
}
}
显示结果:
{
"took" : 957,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.2876821,
"hits" : [
{
"_index" : "logs_server",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.2876821,
"_source" : {
"method" : "GET"
}
}
]
}
}
不被支持的API
不支持写入字段别名:尝试在索引或更新请求中使用别名将导致失败。 同样,别名不能用作 copy_to 的目标或多字段。
由于文档源中不存在别名,因此在执行源过滤时不能使用别名。 例如,以下请求将返回 _source 的空结果:
不支持写入字段别名:尝试在索引或更新请求中使用别名将导致失败。 同样,别名不能用作 copy_to 的目标或多字段。
由于文档源中不存在别名,因此在执行源过滤时不能使用别名。 例如,以下请求将返回 _source 的空结果: