elasticsearch手册(1)基本说明

文章内索引
[显示]

概览

elasticsearch 第1张

安装

1、下载

curl -L -O https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/zip/elasticsearch/2.3.5/elasticsearch-2.3.5.zip

2.解压

unzip elasticsearch-2.3.5.zip
cd elasticsearch-2.3.5

安装Marvel

运行Elasticsearch

./bin/elasticsearch

如果想在后台以守护进程模式运行,添加-d参数

API">API

Elasticsearch为Java用户提供了两种内置客户端:

节点客户端(node client):

节点客户端以无数据节点(none data node)身份加入集群,换言之,它自己不存储任何数据,但是它知道数据在集群中的具体位置,并且能够直接转发请求到对应的节点上。

传输客户端(Transport client):

这个更轻量的传输客户端能够发送请求到远程集群。它自己不加入集群,只是简单转发请求给集群中的节点。

两个Java客户端都通过9300端口与集群交互,使用Elasticsearch传输协议(Elasticsearch Transport Protocol)。集群中的节点之间也通过9300端口进行通信。如果此端口未开放,你的节点将不能组成集群。

TIP

Java客户端所在的Elasticsearch版本必须与集群中其他节点一致,否则,它们可能互相无法识别。

关于Java API的更多信息请查看相关章节:Java API

分布式

Elasticsearch是去中心化方式的集群,master通过选举产生。

主要分片(primary shard)和复制分片(replica shard)

通过GET /_cluster/health命令可以查看集群的健康度Greenà所有主分片与复制分片都可用Yellowà所有主分片可用,部分复制分片不可用Redà不是所有的主要分片都可用

写入主分片,复制分片可以负载读。

通过

可以指定此index下主分片与复制分片的个数,三个主分片每个主分片有一个复制分片

数据

Elasticsearch是文档型非关系型数据格式,使用JSON存储,采用RESET方式调用接口

在Elasticsearch中,文档归属于一种类型(type),而这些类型存在于索引(index)中,我们可以画一些简单的对比图来类比传统关系型数据库:

1

Relational DB -> Databases -> Tables -> Rows -> Columns

Elasticsearch -> Indices -> Types -> Documents -> Fields

Elasticsearch集群可以包含多个索引(indices)(数据库),每一个索引可以包含多个类型(types)(表),每一个类型包含多个文档(documents)(行),然后每个文档包含多个字段(Fields)(列)。

插入数据(PUT)

如果不传入ID则elasticsearch采用UUID作为主键。

获取数据(GET)

可以使用pretty关键字美化json

检索文档的一部分

通常,GET请求将返回文档的全部,存储在_source参数中。但是可能你感兴趣的字段只是title。请求个别字段可以使用_source参数。多个字段可以使用逗号分隔:

elasticsearch手册(1)基本说明|elasticsearch-翰林小院 第2张

数据是否存在(HEAD)

如果你想做的只是检查文档是否存在——你对内容完全不感兴趣——使用HEAD方法来代替GET。HEAD请求不会返回响应体,只有HTTP头:

curl -i -XHEAD http://localhost:9200/website/blog/123存在返回200不存在则返回404

elasticsearch手册(1)基本说明|elasticsearch-翰林小院 第3张

更新数据

文档在Elasticsearch中是不可变的——我们不能修改他们。如果需要更新已存在的文档,我们可以使用《索引文档》章节提到的index API 重建索引(reindex) 或者替换掉它。

elasticsearch手册(1)基本说明|elasticsearch-翰林小院 第4张

创建新的数据

当索引一个文档,我们如何确定是完全创建了一个新的还是覆盖了一个已经存在的呢?

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

POST /website/blog/{ … }

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

elasticsearch手册(1)基本说明|elasticsearch-翰林小院 第5张

如果请求成功的创建了一个新文档,Elasticsearch将返回正常的元数据且响应状态码是201 Created

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

elasticsearch手册(1)基本说明|elasticsearch-翰林小院 第6张

删除文档(DELETE)

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

elasticsearch手册(1)基本说明|elasticsearch-翰林小院 第7张

elasticsearch手册(1)基本说明|elasticsearch-翰林小院 第8张

Elasticsearch采用乐观锁,每个文档都有一个version,我们可以在修改数据时指定版本,如

elasticsearch手册(1)基本说明|elasticsearch-翰林小院 第9张

然而,如果我们重新运行相同的索引请求,依旧指定version=1,Elasticsearch将返回409 Conflict状态的HTTP响应。响应体类似这样:

elasticsearch手册(1)基本说明|elasticsearch-翰林小院 第10张

这告诉我们当前_version是2,但是我们指定想要更新的版本是1。我们需要做什么取决于程序的需求。我们可以告知用户其他人修改了文档,你应该在保存前再看一下。而对于上文提到的商品stock_count,我们需要重新检索最新文档然后申请新的更改操作。

所有更新和删除文档的请求都接受version参数,它可以允许在你的代码中增加乐观锁控制。

使用外部版本控制系统

一种常见的结构是使用一些其他的数据库做为主数据库,然后使用Elasticsearch搜索数据,这意味着所有主数据库发生变化,就要将其拷贝到Elasticsearch中。如果有多个进程负责这些数据的同步,就会遇到上面提到的并发问题。

如果主数据库有版本字段——或一些类似于timestamp等可以用于版本控制的字段——是你就可以在Elasticsearch的查询字符串后面添加version_type=external来使用这些版本号。版本号必须是整数,大于零小于9.2e+18——Java中的正的long。

1

外部版本号与之前说的内部版本号在处理的时候有些不同。它不再检查_version是否与请求中指定的一致,而是检查是否小于指定的版本。如果请求成功,外部版本号就会被存储到_version中。

外部版本号不仅在索引和删除请求中指定,也可以在创建(create)新文档中指定。

例如,创建一个包含外部版本号5的新博客,我们可以这样做:

elasticsearch手册(1)基本说明|elasticsearch-翰林小院 第11张

elasticsearch手册(1)基本说明|elasticsearch-翰林小院 第12张

局部更新

可以使用_update向文档内更新局部信息

elasticsearch手册(1)基本说明|elasticsearch-翰林小院 第13张

检索多个文档

无论是否检索到文档都会返回200而不是404以为mget请求成功了,如果判断是否匹配到数据需要found

请求

elasticsearch手册(1)基本说明|elasticsearch-翰林小院 第14张

响应

elasticsearch手册(1)基本说明|elasticsearch-翰林小院 第15张

批处理

Bulk


©版权声明:本文为【翰林小院】(huhanlin.com)原创文章,转载时请注明出处!

发表评论

电子邮件地址不会被公开。