Elasticsearch提供数据操作和搜索功能在近实时的。默认情况下,从索引/更新/删除数据到显示在搜索结果中的时间的1大约有秒延迟(刷新间隔)。这是与SQL等其他平台的一个重要区别,**其中在完成事务之后数据立即可用。**这句话不会翻译(跳过)。
插入和替换document
我们以前看过我们如何索引一个文档。让我们再次回想一下:
PUT customer/external/1?pretty
{
"name": "xiaoli",
"age": 19
}
同样,上面将指定的文档插入到customer index(external type)中,ID为1。如果我们再次使用不同的(或相同的)文档执行上述命令,Elasticsearch将替换(即重新索引)一个新的document现有的ID为1的顶部:
PUT customer/external/1?pretty
{
"name": "xiaoli",
"age": 20
}
以上将ID为1的文档的age从19更改为20。另外,如果我们使用不同的ID,则新的document将被索引,并且已经在索引中的现有文档保持不变。
PUT customer/external/2?pretty
{
"name": "xiaoli",
"age": 52
}
以上索引一个ID为2的新文档。
索引时,ID部分是可选的。如果未指定,Elasticsearch将生成随机ID
此示例显示如何索引没有显式ID的文档:
POST customer/external?pretty
{
"name": "xiaoguo",
"age": 52
}
请注意,在上述情况下,我们使用POST而不是PUT,因为我们没有指定ID。
注意: 这里说一下替换和更新的区别,如当前的doc为:
{
"name": "Jeki Li",
"age": 18
}
如果替换文档为
{
"age": 19
}
则,执行后查出的数据为
{
"age": 19
}
name字段消失了!下面讲更新
更新文档(updating document)
除了可以索引和替换文档之外,我们还可以更新文档。请注意,Elasticsearch在底层并没有进行更新。每当我们进行更新时,Elasticsearch将删除旧的文档,然后对需要更新的文档进行索引。
此示例显示如何通过将名称字段更改为“Jane Doe”来更新我们以前的文档(ID为1):
POST /customer/external/1/_update?pretty
{
"doc": { "name": "Jane Doe" }
}
我们更新id为1的文档的年龄为52,可以这样操作
POST customer/external/1/_update?pretty
{
"doc": {"age": 52}
}
也可以使用简单的脚本来执行更新。此示例使用脚本将年龄增加5:
POST customer/external/1/_update?pretty
{
"script" : "ctx._source.age += 5"
}
在上面的示例中,ctx._source引用了即将更新的当前源文档。
请注意,目前只能在单个文档上一次执行更新。在将来,Elasticsearch可能会提供更新多个文档的能力,具有查询条件(如SQL UPDATE-WHERE语句)。
删除文档(Deleting Documents)
删除文档是相当简单的。此示例显示如何删除我们之前的ID为2的客户:
DELETE customer/external/1?pretty
请参阅删除按查询API删除与特定查询匹配的所有文档。值得注意的是,删除整个索引而不是使用“按查询删除”API删除所有文档效率更高。
批处理 (Batch Processing)
除了能够索引,更新和删除单个文档之外,Elasticsearch还提供了使用_bulk API批量执行上述任何操作的功能。这个功能很重要,因为它提供了一个非常有效的机制来尽可能快地进行多个操作,尽可能少的网络往返行程。
作为一个快速示例,以下调用 一个批量操作两个文档(ID 1 - John Doe和ID 2 - Jane Doe)
POST customer/external/_bulk?pretty
{"index":{"_id":"1"}}
{"name": "xiaowang","age":18}
{"index":{"_id":"2"}}
{"name": "xiaoqiang","age":"22" }
此示例更新第一个文档(ID为1),然后在一个批量操作中删除第二个文档(ID为2):
POST customer/external/_bulk?pretty
{"update":{"_id":1}}
{"doc":{"name":"dongfangbubai"}}
{"delete":{"_id":2}}
注意,对于删除操作,没有相应的文档,因为删除只需要要删除的文档的ID。
由于其中一个操作失败,Bulk API不会失败。如果一个动作由于任何原因而失败,它将继续处理其后的其余动作。当批量API返回时,它将为每个操作提供一个状态(按照发送的相同顺序),以便您可以检查特定操作是否失败。