欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

elasticsearch6.7 01.入门指南(3)

程序员文章站 2022-03-20 08:50:06
[TOC] 4、Modifying Your Data(修改数据) Elasticsearch 提供了近实时的操纵数据和搜索的能力。 默认情况下,从索引/更新/删除数据到在搜索结果中显示数据会有 1 秒的延迟(刷新间隔)。 这是与其他平台(如SQL) 的一个重要区别,在SQL中,数据在事务完成后立即 ......

4、modifying your data(修改数据)

elasticsearch 提供了近实时的操纵数据和搜索的能力。默认情况下,从索引/更新/删除数据到在搜索结果中显示数据会有 1 秒的延迟(刷新间隔)。这是与其他平台(如sql) 的一个重要区别,在sql中,数据在事务完成后立即可用。

4.1 indexing/replacing documents(索引/替换 文档)

我们先前见过如何索引单个文档。让我们再次调用该命令 :

put /customer/_doc/1?pretty
{
  "name": "john doe"
}

同样,上面将指定的文档索引到customer索引中,且该文档的id为1。如果我们再使用不同(或相同)的文档执行上述命令,elasticsearch将在现有文档的基础上替换(即重新索引)一个id为1的新文档:

put /customer/_doc/1?pretty
{
  "name": "jane doe"
}

上面将 id 为 1 的文档的name“john doe”改成“jane doe”。如果使用的是不同的 id,那么将为新文档编制索引,并且索引中已有的文档将保持不变。

put /customer/_doc/2?pretty
{
  "name": "jane doe"
}

上面将索引一个 id 为 2 的新文档。

在索引时,id 是可选的。如果没有指定id,elasticsearch 将生成一个随机 id,然后使用它去索引文档。elasticsearch生成的实际id(或在前面的示例中显式指定的任何内容)作为索引api调用的一部分返回。

该例子演示了在没有明确的 id 的情况下如何去索引一个文档 :

post /customer/_doc?pretty
{
  "name": "jane doe"
}

注意,在上述的情况下,我们使用了 post 而不是 put,因为我们没有指定 id。

4.2 updating documents(更新文档)

除了可以索引和替换文档之外,我们也可以更新文档。不过,请注意elasticsearch实际上并不是对指定的文档进行更新。每当我们做一次更新,elasticsearch都会删除旧文档,然后索引一个新文档,并一次性对其应用更新。

下例演示了将name字段更改为“jane doe”来更新id为1的旧文档:

post /customer/_update/1?pretty
{
  "doc": { "name": "jane doe" }
}

下例演示了将name字段更改为“jane doe”来更新id为1的旧文档,并同时向其添加age字段:

post /customer/_update/1?pretty
{
  "doc": { "name": "jane doe", "age": 20 }
}

也可以使用简单的scripts(脚本)来执行更新。下例演示了使用scripts来将 age增加 5 :

post /customer/_update/1?pretty
{
  "script" : "ctx._source.age += 5"
}

在上面的例子中,ctx._source 代表当前将被更新的源文档。

elasticsearch提供了在给定查询条件(如sql update-where语句)下更新多个文档的功能。请参阅docs-update-by-query api

4.3 deleting documents(删除文档)

删除文档是很简单的,下例演示了如何删除id 为 2 的 customer(的文档)。

delete /customer/_doc/2?pretty

请看 delete by query api 以删除指定查询匹配到的所有文档。

值得注意的是,直接删除整个索引比使用delete by query api更有效。

4.4 batch processing(批处理)

除了可以索引,更新,和删除单个文档之外,elasticsearch 还提供了使用 _bulk api 来执行上面任何操作的批量方式的能力。这个功能是非常重要,它提供了一种非常有效的机制,可以尽可能减少网络返回且尽可能快的执行多个操作。

举一个简单的例子,在下面一个批量操作中索引了两个文档(id 1 - john doe 和 id 2 - jane doe):

post /customer/_bulk?pretty
{"index":{"_id":"1"}}
{"name": "john doe" }
{"index":{"_id":"2"}}
{"name": "jane doe" }

下例使用一个批量操作更新了第一个文档(id 为 1),删除了第二个文档(id 为 2) :

post /customer/_bulk?pretty
{"update":{"_id":"1"}}
{"doc": { "name": "john doe becomes jane doe" } }
{"delete":{"_id":"2"}}

请注意上面的删除操作,在它后面没有相关的源文档,因为删除操作只需要根据文档的 id 来删除。

bulk api不会因其中一个操作失败而失败。如果单个操作因任何原因失败,bulk操作将继续处理它后面的其他操作。当bulk api返回时,它将为每个操作提供一个状态(按照发送的顺序),以便您可以检查特定操作是否失败。