博客地址:http://www.moonxy.com

一、前言

在 Elasticsearch 中,对文档进行索引等操作时,既可以通过 RESTful 接口进行操作,也可以通过 Java 也可以通过 Java 客户端进行操作。本文主要讲解基于 RESTful 的文档索引与管理方法,后面章节再讲面向 Java 客户端的编程方法。

使用 RESTful API 时,主要有如下四种方式可以选择:

方式一:可以使用终端中的 curl 命令,如果还没有安装,按照系统的不同,执行不同的安装命令,CentOS 用 yum -y install curl 安装,Ubuntu 用 sudo apt-get install curl 安装。

方式二:可以使用 Elasticsearch-head 插件,通过切换不同的页签,可以执行不同的操作。

方式三:Elastic Stack 官方推出的 Kibana 提供了 Dev Tools,专用于执行此类代码,其前身为 Chrome 的 Sense 插件。

方式四:使用 Chrome 谷歌浏览器的 Sense 插件,唯一的缺点是对中文的支持不太理想,也可以使用 Postman 插件。

以下我们方式三,使用 Kibana 提供的 Dev Tools 工具。

在创建索引之前,首先了解 RESTful API 的调用风格,在管理和使用 ElasticSearch 服务时,常用的 HTTP 动词有下面五个:

GET 请求:获取服务器中的对象

相当于 SQL 的 Select 命令
GET /blogs:列出所有博客

POST 请求:在服务器上更新对象

相当于 SQL 的 Update 命令
POST /blogs/ID:更新指定的博客

PUT 请求:在服务器上创建对象

相当于 SQL 的 Create 命令
PUT /blogs/ID:新建一个博客  

DELETE 请求:删除服务器中的对象

相当于 SQL 的 Delete 命令
DELETE /blogs/ID:删除指定的博客

HEAD 请求:仅仅用于获取对象的基础信息

二、索引管理

2.1 创建索引

PUT blog

返回响应结果:

{
"acknowledged": true,
"shards_acknowledged": true,
"index": "blog"
}

本文章内的命令,如无特别说明,默认均在 Kibana 的 Dev Tools 中执行,如下图所示:

创建索引时,也可以在指定索引数据的 shards 分片数量 和 replicas 副本数量,如果不指定,系统会采用默认值,分别是 shards 数量为 5,replicas 数量为1。Elasticsearch 默认给一个索引设置 5 个分片和 1 个副本,一个索引的分片数一经指定后就不能再修改,副本数可以通过命令随时修改。如果想创建自定义分片数和副本数的索引,可以通过 settings 参数在索引时设置初始化信息。

PUT blog
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1
}
}

2.2 查看索引

使用 HTTP 的操作类型 GET,GET {index}/_settings 子句,则可以获取当前索引文件的较为详细的配置信息。

GET blog/_settings

返回响应结果:

{
"blog": {
"settings": {
"index": {
"creation_date": "1527989901762",
"number_of_shards": "5",
"number_of_replicas": "1",
"uuid": "HKq5wwD3S8ObJq7Q2tZn2g",
"version": {
"created": "5060099"
},
"provided_name": "blog"
}
}
}
}

该命令对应的 curl 命令为:

curl -XGET 'http://192.168.56.110:9200/blog/_settings'

curl -XGET "http://192.168.56.110:9200/blog/_settings"

以上两天 curl 命令在 Linux 上,使用单引号或者双引号包裹请求内容均可。

但在 Windows 上只能使用第二种,即用双引号包裹,用单引号时会出现错误 curl: (1) Protocol "'http" not supported or disabled in libcurl,如下:

C:\Users\Administrator>curl -XGET 'http://192.168.56.110:9200/blog/_settings'
curl: (1) Protocol "'http" not supported or disabled in libcurl C:\Users\Administrator>curl -XGET "http://192.168.56.110:9200/blog/_settings"
{"blog":{"settings":{"index":{"creation_date":"1527989901762","number_of_shards"
:"5","number_of_replicas":"1","uuid":"HKq5wwD3S8ObJq7Q2tZn2g","version":{"create
d":"5060099"},"provided_name":"blog"}}}}

2.3 更新副本数

Elasticsearch 支持修改一个已经存在索引的副本数,命令如下:

PUT blog
{
"settings": {
"number_of_replicas": 1
}
}

2.4 关闭和打开索引

一个关闭的索引将禁止读取和写入其中的数据,而一个打开的索引文件可以允许用户对其中的数据进行相应的操作。

关闭索引:

POST blog/_close

打开索引:

POST blog/_open

2.5 删除索引

DELETE blog

三、文档管理

Mapping 也称为映射,映射可分为动态映射和静态映射。在关系型数据库中写入数据之前首先要建表,在建表语句中声明字段的属性,在 Elasticsearch 中则不必如此,Elasticsearch 最重要的功能之一就是让你尽可能地开始探索数据,文档写入 Elasticsearch 中,它会根据字段的类型自动识别,这种机制称为动态映射,而静态映射则是写入数据之前对字段的属性进行手工设置。

上面只创建了一个索引,并没有设置 mapping,查看一下索引 mapping 的内容:

GET blog/_mapping

返回响应结果:

{
"blog": {
"mappings": {}
}
}

可以看到 mapping 为空,我们只创建了一个索引,并没有进行 mapping 配置,所以 mapping 为空。

下面给 blog 这个索引加一个 type,type name 为 article,并设置 mapping:

POST blog/article/_mapping
{
"article": {
"properties": {
"id": {
"type": "text"
},
"title": {
"type": "text"
},
"postdate": {
"type": "date"
},
"content": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}

返回响应结果:

{
"acknowledged": true
}

也可以在创建索引时就定义好映射,如下:

PUT forum
{
"mappings": {
"article": {
"properties": {
"id": {
"type": "text"
},
"title": {
"type": "text"
},
"postdate": {
"type": "date"
},
"content": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
}

返回响应结果:

{
"acknowledged": true,
"shards_acknowledged": true,
"index": "forum"
}

3.1 新建文档

此处需要注意 PUT 和 POST,一般认为 POST 方法用来创建资源(具有非幂等性),而 PUT 方法则用来更新资源(具有幂等性)。

PUT blog/article/1
{
"id": "1001",
"title": "Git简单介绍",
"postdate": "2018-06-03",
"content": "Git是一款免费、开源的分布式版本控制系统"
}

返回响应结果:

{
"_index": "blog",
"_type": "article",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"created": true
}

3.2 查看文档

GET blog/article/1

返回响应结果:

{
"_index": "blog",
"_type": "article",
"_id": "1",
"_version": 1,
"found": true,
"_source": {
"id": "1001",
"title": "Git简单介绍",
"postdate": "2018-06-03",
"content": "Git是一款免费、开源的分布式版本控制系统"
}
}

返回结果中前4个属性表明文档的位置和版本信息,found 属性表明是否查询到文档,_source 字段中是文档的内容。

如果某个文档不存在,如下:

GET blog/article/1008611

返回响应结果:

{
"_index": "blog",
"_type": "article",
"_id": "1008611",
"found": false
}

可以看出,found 属性值为 false,因为文档不存在,当然也就没有版本信息和 source 字段。

使用 HEAD 命令可以检查一个索引或文档是否存在:

HEAD blog/article/1

返回响应结果:

200 - OK

如果文档存在,返回 "200 - OK",反之返回 "404 - Not Found"。

3.3 更新文档

POST blog/article/1/_update
{
"doc": {
"title":"Git分布式版本控制工具简介"
}
}

返回响应结果:

{
"_index": "blog",
"_type": "article",
"_id": "1",
"_version": 2,
"result": "noop",
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
}
}

3.4 删除文档

DELETE blog/article/1

返回响应结果:

{
"found": true,
"_index": "blog",
"_type": "article",
"_id": "1",
"_version": 3,
"result": "deleted",
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
}
}

可以看到 _shards 中的 total 参数为 2,表示该文档存在与两个分片中(一个主分片,一个副本分片),successful 也为 2,表示执行成功了两个分片中的文档(表示分别从主分片中删除了一条文档,从副本分片中删除了一条文档),所以执行失败的文档数量 failed 为 0。

3.5 批量操作

Elasticsearch 中不仅提供了一个一个操作文档文档的 API,还提供了文档的批量操作机制,通过 Bulk API 可以执行批量索引、批量删除、批量更新等操作。

可以从 https://github.com/bly2k/files/blob/master/accounts.zip 下载一个样本数据集,然后解压到 /opt/elk 目录下,然后批量索引文档:

[root@masternode elk]# pwd
/opt/elk
[root@masternode elk]# ll
total
-rwxr-xr-x root root Jun : accounts.json
drwxr-xr-x. esuser esuser May : elasticsearch-5.6.
drwxrwxr-x esuser esuser Sep kibana-5.6.-linux-x86_64
[root@masternode elk]# curl -XPOST 'http://192.168.56.110:9200/bank/account/_bulk?pretty' --data-binary @accounts.json

查看索引

GET _cat/indices?v

返回响应结果:

health status index   uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green open forum 9M7dtsGDSTWOJAKTJxejXQ .5kb 810b
green open moonxy rkQ2UUsZR-iSyOIt1HJzdw .8kb 955b
green open .kibana 1lJLwJHZTKWgbNfBpzIXXA .5kb .7kb
green open blog HKq5wwD3S8ObJq7Q2tZn2g .4kb .2kb
green open bank zFkIZRe5Rj6gwhejxV-Wog .2mb .8kb

四、数据查询

4.1 返回所有文档

GET blog/article/_search

返回响应结果:

{
"took": 12,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 1,
"hits": [
{
"_index": "blog",
"_type": "article",
"_id": "2",
"_score": 1,
"_source": {
"id": "1002",
"title": "SVN简介",
"postdate": "2018-06-03",
"content": "SVN是一款免费、开源的集中式版本控制系统"
}
},
{
"_index": "blog",
"_type": "article",
"_id": "1",
"_score": 1,
"_source": {
"id": "1001",
"title": "Git简单介绍",
"postdate": "2018-06-03",
"content": "Git是一款免费、开源的分布式版本控制系统"
}
}
]
}
}

上面代码中,返回结果的 took 字段表示该操作的耗时(单位为毫秒),timed_out 字段表示是否超时,hits 字段表示命中的记录,里面子字段的含义如下。

total:返回记录数,本例是2条。

max_score:最高的匹配程度,本例是1.0。

hits:返回的记录组成的数组。

返回的记录中,每条记录都有一个_score 字段,表示匹配的程序,默认是按照这个字段降序排列。

4.2 全文检索

GET blog/article/_search
{
"query" : { "match" : { "content" : "分布式版本控制工具" }}
}

返回响应结果:

{
"took": 21,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 1.6194323,
"hits": [
{
"_index": "blog",
"_type": "article",
"_id": "1",
"_score": 1.6194323,
"_source": {
"id": "1001",
"title": "Git简单介绍",
"postdate": "2018-06-03",
"content": "Git是一款免费、开源的分布式版本控制系统"
}
},
{
"_index": "blog",
"_type": "article",
"_id": "2",
"_score": 0.80971617,
"_source": {
"id": "1002",
"title": "SVN简介",
"postdate": "2018-06-03",
"content": "SVN是一款免费、开源的集中式版本控制系统"
}
}
]
}
}

可以看到两个文档的 _score 得分不一样,含有分词项多的文档相应的得分也高。

Elastic Stack 笔记(四)Elasticsearch5.6 索引及文档管理的更多相关文章

  1. Elastic Stack 笔记(八)Elasticsearch5.6 Java API

    博客地址:http://www.moonxy.com 一.前言 Elasticsearch 底层依赖于 Lucene 库,而 Lucene 库完全是 Java 编写的,前面的文章都是发送的 RESTf ...

  2. Elastic Stack 笔记(九)Elasticsearch5.6 集群管理

    博客地址:http://www.moonxy.com 一.前言 集群搭建好以后,在日常中就要对集群的使用情况进行监控,对于一个多节点集群,由于网络连接问题,出现宕机.脑裂等异常情况都是有可能发生的.E ...

  3. elasticsearch最全详细使用教程:入门、索引管理、映射详解、索引别名、分词器、文档管理、路由、搜索详解

    一.快速入门1. 查看集群的健康状况http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 状 ...

  4. elasticsearch系列三:索引详解(分词器、文档管理、路由详解(集群))

    一.分词器 1. 认识分词器  1.1 Analyzer   分析器 在ES中一个Analyzer 由下面三种组件组合而成: character filter :字符过滤器,对文本进行字符过滤处理,如 ...

  5. elasticsearch查询篇索引映射文档数据准备

    elasticsearch查询篇索引映射文档数据准备 我们后面要讲elasticsearch查询,先来准备下索引,映射以及文档: 我们先用Head插件建立索引film,然后建立映射 POST http ...

  6. SpringBoot学习笔记:Swagger实现文档管理

    SpringBoot学习笔记:Swagger实现文档管理 Swagger Swagger是一个规范且完整的框架,用于生成.描述.调用和可视化RESTful风格的Web服务.Swagger的目标是对RE ...

  7. Elastic Stack 笔记(一)CentOS7.5 搭建 Elasticsearch5.6 集群

    博客地址:http://www.moonxy.com 一.前言 Elasticsearch 是一个基于 Lucene 的分布式搜索引擎服务,采用 Java 语言编写,使用 Lucene 构建索引.提供 ...

  8. Elastic Stack 笔记(十)Elasticsearch5.6 For Hadoop

    博客地址:http://www.moonxy.com 一.前言 ES-Hadoop 是连接快速查询和大数据分析的桥梁,它能够无间隙的在 Hadoop 和 ElasticSearch 上移动数据.ES ...

  9. Elastic Stack 笔记(二)Elasticsearch5.6 安装 IK 分词器和 Head 插件

    博客地址:http://www.moonxy.com 一.前言 Elasticsearch 作为开源搜索引擎服务器,其核心功能在于索引和搜索数据.索引是把文档写入 Elasticsearch 的过程, ...

随机推荐

  1. 自己实现spring核心功能 一

    聊聊spring spring对于java开发者来说,是最熟悉不过的框架了,我们日常开发中每天都在使用它.它有着各种各样的好处,简单易用,得心应手... ... 我们一说到spring就会讲到ioc ...

  2. 5.MySQL数据库操作步骤

    第一步:登录到MySQL服务器 第二步:选择当前要操作的数据库 第三步:设置请求和返回数据的字符集 第四步:执行SQL语句 l 增加记录:INSERT INTO news(title,content) ...

  3. html5新特性-header,nav,footer,aside,article,section等各元素的详解

    Html5新增了27个元素,废弃了16个元素,根据现有的标准规范,把HTML5的元素按优先级定义为结构性属性.级块性元素.行内语义性元素和交互性元素四大类. 下面是对各标签的详解,section.he ...

  4. Cacti 管理员密码忘记找回

    1.登陆数据库: # mysql -uroot -p MariaDB [(none)]> show databases; +--------------------+ | Database | ...

  5. Flink的TaskManager启动(源码分析)

    通过启动脚本已经找到了TaskManager 的启动类org.apache.flink.runtime.taskexecutor.TaskManagerRunner 来看一下它的main方法中 最后被 ...

  6. 图表控件业界革命 -Arction新产品LightningChart JS 上市

    芬兰高科技企业Arction Ltd 在今年8月份推出了用于网页的数据可视化控件新解决方案—— LightningChart JS. 初次的基准测试表明,该产品为网页应用程序的数据可视化刷新了新的纪录 ...

  7. 【spring-boot 源码解析】spring-boot 依赖管理

    关键词:spring-boot 依赖管理.spring-boot-dependencies.spring-boot-parent 问题 maven 工程,依赖管理是非常基本又非常重要的功能,现在的工程 ...

  8. Mac应用程序无法打开或文件损坏的处理方法你知道吗?

    很多用户在安装Mac软件的时候,经常会遇到提示“xxx.app已损坏,打不开.您应该将它移到废纸篓“或”打不开的xxx.app,因为它来自身份不明的开发者”,如下图的样子: 真的损坏了么?是不是真的要 ...

  9. 体验SpringCloud Gateway

    Spring Cloud Gateway是Spring Cloud技术栈中的网关服务,本文实战构建一个SpringCloud环境,并开发一个SpringCloud Gateway应用,快速体验网关服务 ...

  10. Keras(六)Autoencoder 自编码 原理及实例 Save&reload 模型的保存和提取

    Autoencoder 自编码 压缩与解压 原来有时神经网络要接受大量的输入信息, 比如输入信息是高清图片时, 输入信息量可能达到上千万, 让神经网络直接从上千万个信息源中学习是一件很吃力的工作. 所 ...