最近打算写一些关于ES(elasticsearch),又名分布式搜索的的相关知识介绍,先简单介绍一下其中的数据类型,关于什么叫索引,什么叫文档,以及如何来操作都会慢慢介绍的。
Alias field type
Field type:alias(别名)
可以给索引中定义的具体字段field映射一个别名alias,可以在搜索请求中使用别名来代替索引中定义的field。
下面是创建一个映射关系:
curl -X PUT "localhost:9200/trips?pretty" -H 'Content-Type: application/json' -d'
{
"mappings": {
"properties": {
"distance": {
"type": "long"
},
"route_length_miles": {
"type": "alias",
"path": "distance"
},
"transit_mode": {
"type": "keyword"
}
}
}
}
'
curl -X GET "localhost:9200/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"range" : {
"route_length_miles" : {
"gte" : 39
}
}
}
}
'
可以通过上面的报文,我们可以看到定义了一个索引为trips的映射关系,该映射关系中包含3个field:
其中route_length_miles的type是Alias,映射指向的是field为distance,意思就是说如果我查询route_length_miles,也就相当于查询distance的值
下面的搜索请求,可以看出,是一个范围range查询,请求中的field是route_length_miles,要求是该值大于39,符合这个条件的所有文档就会被过滤出来
需要注意的是:route_length_miles中有一个path的属性,该值指向的是别名所要映射到的field,而且必须是全路径,包含其父路径,比如 obj1.obj2.field
几乎所有的查询请求都是接受field的别名的。尤其是,别名可以被用在query,聚集,排序等相关的field,也包含哪些请求docvalue_fields,stored_fields,suggestions,highlights。当通过使用脚本来访问field的value的时候,也是支持别名的。
在搜索请求的某些部分以及请求字段功能时,可以提供字段通配符模式。在这些情况下,通配符模式除了具体字段外,还将匹配字段别名:
curl -X GET "localhost:9200/trips/_field_caps?fields=route_*,transit_mode&pretty"
别名alias的使用限制
当使用alias别名的时候,也是存在一些限制的,下面会列举一下:
此外还需要注意:一个别名只能对应一个field。
可以通过更新映射关系来更新别名对应的映射field
不支持的API
由于document _source中不存在别名,因此在执行源筛选时不能使用别名。例如,以下请求将为_source返回空结果:
curl -X GET "localhost:9200/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query" : {
"match_all": {}
},
"_source": "route_length_miles"
}
'
最后,一些查询(例如term,geo_shape和more_like_this)允许从索引文档中获取查询信息。因为在获取文档时不支持字段别名,所以查询中指定查找路径的部分不能通过其别名引用字段。