前言
Elasticsearch可以支持全文检索,那么ES是以什么机制来支持的,这里索引就是一个重要的步骤,经过索引之后的文档才可以被分析存储、建立倒排索引。
本篇就是以ES的数据检索操作来讨论的。
更多内容情参考:
索引操作
ES索引可以根据指定的index和type进行增加或者更新文档,ID可以指定也可以不指定(index API为我们自动生成)
curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}'
这里指定了索引twitter、类型tweet、Id为1
索引操作的结果如下:
{
"_shards" : {
"total" : 10,
"failed" : 0,
"successful" : 10
},
"_index" : "twitter",
"_type" : "tweet",
"_id" : "1",
"_version" : 1,
"created" : true
}
上面_shards中描述了分片相关的信息,即当前一共有10个分片(5个主分片,5个副本);
以及index、type、id、version相关信息
- total:表示现在在使用的分片数量(主分片和副本)
- successful:操作成功的分片数量
- failed:操作失败的分片数量
自动创建索引
如果上面索引操作之前,ES中还没有这个索引,那么默认会创建这个索引,并且type类型也会自动创建,也就是说,ES并不需要像传统数据库那样预先定义表的结构。
每个索引都有一个mapping映射,这个映射也是动态生成的,因此当添加新的字段时,会自动的添加mapping映射。
通过在所有节点的配置文件中设置action_create_index
为false
,可以关闭自动索引创建这个功能,默认是打开的
通过在所有节点的配置文件中设置index.mapper.dynamic
为false
,可以关闭自动映射创建功能。
通过在所有节点的配置文间中设置action.auto_create_index
为+aaa*,-bbb*,+ccc*,-*
有选择性的创建某些索引。
关闭自动mapping映射功能时,就会引发第一次索引的数据失败,这里我们就要自己手动的put一个映射Elasticsearch-Mapping映射
版本控制
Elasticsearch采用乐观并发控制,当程序并发性比较高的时候,就会产生脏读,所以ES就使用版本号用来避免文档冲突,这里不多过多介绍,分成专门的一篇来介绍ES的版本控制问题Elasticsearch-版本控制
操作类型
ES通过设置一个参数op_type控制索引操作”缺少即加入”,当设置op_type
为
create
时,如果索引时指定的id已经存在,那么索引操作就会失败
上面的op_type=create与直接使用_create API,效果一样:
curl -XPUT 'http://localhost:9200/twitter/tweet/1?op_type=create' -d '{
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}'
等价于:
curl -XPUT 'http://localhost:9200/twitter/tweet/1/_create' -d '{
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}'
如果使用自动id生成就不存在这个问题了。
自动ID创建:
前面提到创建索引时可以指定ID,也可以不指定ID,如果不指定ID,那么ES会自动的生成一个ID,并且把op_type
更改为create
。
这里需要指出的就是此时HTTP方法将不再是put
,更改为POST
curl -XPOST 'http://localhost:9200/twitter/tweet/' -d '{
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}'
返回的结果如下:
{
"_index" : "twitter",
"_type" : "tweet",
"_id" : "6a8ca01c-7896-48e9-81cc-9f70661fcb32",
"_version" : 1,
"created" : true
}
路由routing
所有的文档API(get、index、delete、bulk、update、mget)都接收一个routing参数,它用来自定义文档到分片的映射。自定义路由值可以确保所有相关文档都被保存在同一分片上。
shard = hash(routing) % number_of_primary_shards
设置了路由值,就相当于告诉ES文档操作针对的具体分片。