elasticsearch (二) 入门

让我们建立一个员工目录


创建数据

假设我们刚好在Megacorp工作,这时人力资源部门出于某种目的需要让我们创建一个员工目录,这个目录用于促进人文关怀和用于实时协同工作,所以它有以下不同的需求:

  • 数据能够包含多个值的标签、数字和纯文本。
  • 检索任何员工的所有信息。
  • 支持结构化搜索,例如查找30岁以上的员工。
  • 支持简单的全文搜索和更复杂的短语(phrase)搜索
  • 高亮搜索结果中的关键字
  • 能够利用图表管理分析这些数据

首先创建一个员工

系统返回结果

这个文档是employee类型,属于megacorp索引。如果说之前elasticsearch中没有employee类型或者megacorp索引的话,系统会自动创建。 并且上面插入数据的时候指定了_id为1,所以插入数据后,这个文档的_id就是为1。假设不指定_id的话,系统会默认设置一个_id。如下,

PS: 上面两次操作中,一次使用了PUT,一次使用了POST,区别就是PUT是修改,必须制定_id,如果elasticsearch中不存在的话会进行插入操作,类似mysql中的replace intoPOST的话就是正常的插入操作。

当我们插入一条数据的时候,系统返回中有_index_type_id_version前三个上文已说过,接下来说下_version

Elasticsearch中每个文档都有版本号,每当文档变化(包括删除)都会使_version增加。在《版本控制》章节中我们将探讨如何使用_version号确保你程序的一部分不会覆盖掉另一部分所做的更改。


检索文档

输入命令

返回结果

命令中主要逻辑为_index/_type/_id进行查找,参数pretty的作用是美化输出结果。

返回结果中,found的记过为boolean,表示是否成功。_source表示我们所查的具体文档。

如果是查询不到内容的话_found字段的值为false,如下

我们也可以指定返回文档中的一部分

当然也可以只返回_source


创建一个新文档

请记住_index_type_id三者唯一确定一个文档。所以要想保证文档是新加入的,最简单的方式是使用POST方法让Elasticsearch自动生成唯一_id

然而,如果想使用自定义的_id,我们必须告诉Elasticsearch应该在_index_type_id三者都不同时才接受请求。为了做到这点有两种方法,它们其实做的是同一件事情。你可以选择适合自己的方式:

第一种方法使用op_type查询参数:

或者第二种方法是在URL后加/_create做为端点:

如果包含相同的_index_type_id的文档已经存在,Elasticsearch将返回409 Conflict响应状态码,错误信息类似如下:


更新整个文档

系统返回的数据中_version进行了自增。created等于false表示这次操作不是创建。

其实文档在Elasticsearch中是不可变的——我们不能修改他们。在内部,Elasticsearch已经标记旧文档为删除并添加了一个完整的新文档。旧版本文档不会立即消失,但你也不能去访问它。Elasticsearch会在你继续索引更多数据时清理被删除的文档。


文档局部更新

其实局部更新与整体更新一样。Elasticsearch内部都是这个过程如下:

  1. 从旧文档中检索JSON
  2. 修改它
  3. 删除旧文档
  4. 索引新文档

删除文档

删除文档的语法模式与之前基本一致,只不过要使用DELETE方法: