modifying your data 修改你的数据


Elasticsearch提供近乎实时的数据操作和搜索功能。


indexing/replacing documents 索引/替换 文档






我们之前已经看到过我们如何索引一个文档。让我们再次回顾这个命令:



<span style="font-size:14px;">curl -XPUT 'localhost:9200/customer/external/1?pretty' -d '
{
  "name": "John Doe"
}'</span>



上述命令将会索引一个文档到customer索引中,索引类型为external 并且拥有的id号为1. 如果我们重新执行一下这条命令但是提交的数据(文档)不同,那么elasticsearch就会替换之前索引的文档:

<span style="font-size:14px;">curl -XPUT 'localhost:9200/customer/external/1?pretty' -d '
{
  "name": "Jane Doe"
}</span>



现在,原来的id为1的文档将会被这个新的文档替换。但是如果我们使用不同的id号:

<span style="font-size:14px;">curl -XPUT 'localhost:9200/customer/external/2?pretty' -d '
{
  "name": "Jane Doe"
}'</span>



那么原来的已经被索引的文档将不会被替换。一个新的文档,索引类型为external,id为2 将会被索引到customer索引中。

在索引文档的时候ID的指定是可选的,在未指定的情况下elasticsearch会自动指定一个随机的ID号。实际的ID号,例如elasticsearch生成的,或者我们指定的ID,会作为索引API调用的一部分被返回。




如下命令展示了,如何不指定ID 号,而是让elasticsearch自动生成ID:


<span style="font-size:14px;">curl -XPOST 'localhost:9200/customer/external?pretty' -d '
{
  "name": "Jane Doe"
}'</span>



注意,我们使用了POST 来代替 PUT。



updating documents 更新文档



除了能够删除和替换索引的文档之外,我们还可以更新文档。注意,elasticsearch会删除旧的文档,并用更新后的文档来替代。 这个例子展示了通过改变名字为“李四”,以更新我们先前的文档(ID 1):



<span style="font-size:14px;">curl -XPOST 'localhost:9200/customer/external/1/_update?pretty' -d '
{
  "doc": { "name": "Jane Doe" }
}'</span>


下面的例子,展示了通过添加一个新的域 age来更新先前的文档:


<span style="font-size:14px;">curl -XPOST 'localhost:9200/customer/external/1/_update?pretty' -d '
{
  "doc": { "name": "Jane Doe", "age": 20 }
}'</span>



更新还可以通过使用简单的脚本来执行。此示例使用一个脚本来实现修改age域:


<span style="font-size:14px;">curl -XPOST 'localhost:9200/customer/external/1/_update?pretty' -d '
{
  "script" : "ctx._source.age += 5"
}'</span>



在上面的例子中,ctx._source指的是当前的即将被更新的文件。



在刚才讲的内容中,你会发现elasticsearch都是一次更新一个文档,后续学习中你会发现,elasticsearch通过条件查询语句提供了一次更新多个文档的功能。类似于 SQL UPDATE-WHERE语句。






deleting documents 删除文档



删除文档是相当简单的。这个例子说明了如何删除我们之前的ID为2的客户文档:



<span style="font-size:14px;">curl -XDELETE 'localhost:9200/customer/external/2?pretty'</span>



当然我们还可以通过一个查询匹配条件来一次删除多个文档:


<span style="font-size:14px;">curl -XDELETE 'localhost:9200/customer/external/_query?pretty' -d '
{
  "query": { "match": { "name": "John" } }
}'</span>



注意URI 中的/_query语法,这种方式会告诉delete-by-query  API,删除查询语句在提交的数据中。但是我们依然使用DELETE方法,我们将在后续对此进行说明。




batch processing 批量处理



除了索引、更新、删除单独的文档外,elasticsearch还通过_bulk API 提供了针对上述操作的批量处理的功能。这个功能是非常重要的,它提供了一种非常有效的机制,能够在耗费非常少的网络路由往返时间的同时尽可能快的执行批量操作。



一个简单的例子,下面的命令将一次索引两个文档:

<span style="font-size:14px;">curl -XPOST 'localhost:9200/customer/external/_bulk?pretty' -d '
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }
'</span>


本示例演示更新第一个文档,然后删除第二个文档:



<span style="font-size:14px;">curl -XPOST 'localhost:9200/customer/external/_bulk?pretty' -d '
{"update":{"_id":"1"}}
{"doc": { "name": "John Doe becomes Jane Doe" } }
{"delete":{"_id":"2"}}
'</span>



注意,_bluk API 将会顺序的执行每一个操作,当一个操作因为某种原因失败之后,它会继续执行其后的操作。 当所有操作执行完毕,_bluk API 会返回一个状态列表,顺序和执行操作的顺序一致。以便于检查特定操作的执行结果