1、简单使用
1.1、先插入数据
user1索引:
{
"took": 0,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 1.0,
"hits": [
{
"_index": "user1",
"_type": "_doc",
"_id": "2",
"_score": 1.0,
"_source": {
"name": "李四",
"age": 30
}
},
{
"_index": "user1",
"_type": "_doc",
"_id": "1",
"_score": 1.0,
"_source": {
"name": "张三",
"age": 20
}
}
]
}
}
user2索引:
{
"took": 0,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 1.0,
"hits": [
{
"_index": "user2",
"_type": "_doc",
"_id": "2",
"_score": 1.0,
"_source": {
"name": "赵六",
"age": 40
}
},
{
"_index": "user2",
"_type": "_doc",
"_id": "1",
"_score": 1.0,
"_source": {
"name": "王五",
"age": 20
}
}
]
}
}
1.2、为索引user1/user2指定别名为user
# 为索引user1/user2指定别名为user
POST /_aliases
{
"actions": [
{
"add": {
"indices": ["user1","user2"],
"alias": "user"
}
}
]
}
1.3、通过别名查询数据
查询语句:
# 查询年龄大于等于25的用户
GET /user/_search
{
"query": {
"bool": {
"filter": [
{
"range": {
"age": {
"gte": 25
}
}
}
]
}
}
}
查询结果:
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 10,
"successful": 10,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 0.0,
"hits": [
{
"_index": "user1",
"_type": "_doc",
"_id": "2",
"_score": 0.0,
"_source": {
"name": "李四",
"age": 30
}
},
{
"_index": "user2",
"_type": "_doc",
"_id": "2",
"_score": 0.0,
"_source": {
"name": "赵六",
"age": 40
}
}
]
}
}
1.4、小结
可以看到, 当我们通过别名user进行搜索的时候,ES会帮我们从别名为user对应的两个索引库:user1、user2中查询满足条件的记录,然后聚合返回给我们
2、操作别名的方法
2.1、查询整个es集群中的所有别名
http://IP:9200/_alias
2.2、重命名别名
重命名一个别名是在同一个 API 中执行添加、删除操作。 这个操作是原子的,不用担心别名不指向索引的短时间
把user1和user2的别名user修改为useralias
POST _aliases
{
"actions": [
{
"add": {
"index": "user1",
"alias": "useralias"
}
},
{
"add": {
"index": "user2",
"alias": "useralias"
}
},
{
"remove": {
"index": "user1",
"alias": "user"
}
},
{
"remove": {
"index": "user2",
"alias": "user"
}
}
]
}
再看user1和user2的别名
{
"user1": {
"aliases": {
"useralias": {}
}
},
"user2": {
"aliases": {
"useralias": {}
}
}
}
2.3、别名filter(相当于MySQL的视图)
添加filter
POST /_aliases
{
"actions": [
{
"add": {
"index": "user1",
"alias": "userfilter",
"filter": {
"range": {
"age": {
"gte": 25
}
}
}
}
}
]
}
现在再去查询user1的别名信息
"user1": {
"aliases": {
"useralias": {
"filter": {
"range": {
"age": {
"gte": 25
}
}
}
}
}
},
"user2": {
"aliases": {
"useralias": {}
}
}
再去查询useralias看看查出什么
{
"took": 4,
"timed_out": false,
"_shards": {
"total": 10,
"successful": 10,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 4,
"max_score": 1.0,
"hits": [
{
"_index": "user2",
"_type": "_doc",
"_id": "_aliases",
"_score": 1.0,
"_source": {
"actions": [
{
"add": {
"indices": [
"user1",
"user2"
],
"alias": "user"
}
}
]
}
},
{
"_index": "user1",
"_type": "_doc",
"_id": "2",
"_score": 1.0,
"_source": {
"name": "李四",
"age": 30
}
},
{
"_index": "user2",
"_type": "_doc",
"_id": "2",
"_score": 1.0,
"_source": {
"name": "赵六",
"age": 40
}
},
{
"_index": "user2",
"_type": "_doc",
"_id": "1",
"_score": 1.0,
"_source": {
"name": "王五",
"age": 20
}
}
]
}
}
此时发现user1中的张三不见了?为什么?因为张三的年龄只有20,被filter过滤掉了
2.4、多个索引指向了同一个别名,索引数据的时候怎么使用别名?
如果有多个索引指向了同一个别名,这时又想保存数据,应该指定好要将数据保存到哪一个索引中,不然会报错
错误示范:
现在指定好要把数据存进哪一个索引
http://IP:9200/_aliases
{
"actions": [
{
"add": {
"index": "user1",
"alias": "useralias",
"is_write_index": true
}
},
{
"add": {
"index": "user2",
"alias": "useralias",
"is_write_index": false
}
}
]
}
对比一下别名内容
再进行索引的操作