当创建一个文档,你可以自定义_id,也可以让Elasticsearch帮你自动生成
读一行数据前锁定这行,然后确保只有加锁的那个线程可以修改这行数据
比对版本号 _version ,如果版本号一致,则修改这行数据,_version++; 如果版本号不一致,则抛出异常
lasticsearch即是同步的又是异步的,意思是这些复制请求都是平行发送的,并无序(out of sequence)的到达目的地。
这就需要一种方法确保老版本的文档永远不会覆盖新的版本。
一种常见的结构是使用一些其他的数据库做为主数据库,然后使用Elasticsearch搜索数据,这意味着所有主数据库发生变化,就要将其拷贝到Elasticsearch中。
如果有多个进程负责这些数据的同步,就会遇到上面提到的并发问题。
POST /index_name/type_name/_mget
POST /website/blog/_mget
{ "ids" : [ "2", "1" ] }
{
"docs" : [
{
"_index" : "website",
"_type" : "blog",
"_id" : "2",
"_version" : 10,
"found" : true,
"_source" : {
"title": "My first external blog entry",
"text": "This is a piece of cake..."
}
},
{
"_index" : "website",
"_type" : "blog",
"_id" : "1",
"found" : false
}
]
}
必须指定文档的_index、_type、_id这些元数据(metadata)
每行必须以"\n"符号结尾,包括最后一行。这些都是作为每行有效的分离而做的标记。
每一行的数据不能包含未被转义的换行符,它们会干扰分析——这意味着JSON不能被美化打印。
{ action: { metadata }}\n { request body }\n { action: { metadata }}\n { request body }\n
- 行为(action)必须是以下几种:
行为 | 解释 | 备注 |
---|---|---|
create | 当文档不存在时创建之。 | 必须指元数据(metadata) |
index | 创建新文档或替换已有文档。 | 必须指元数据(metadata) |
update | 局部更新文档。 | 必须指元数据(metadata) |
delete | 删除一个文档。 | 没有请求体 |
进程不能是随机的,因为我们将来要检索文档。它根据一个简单的算法决定:
shard = hash(routing) % number_of_primary_shards # routing值是一个任意字符串,它默认是_id但也可以自定义。 # 余数(remainder)的范围永远是0到number_of_primary_shards - 1 # 如果主分片的数量在未来改变了,所有先前的路由值就失效了,文档也就永远找不到了。