elasticsearch手册(1)基本说明
概览
安装
1、下载
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à不是所有的主要分片都可用
写入主分片,复制分片可以负载读。
通过
1 2 3 4 5 6 7 |
PUT /blogs { "settings" : { "number_of_shards" : 3, "number_of_replicas" : 1 } } |
可以指定此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)
1 2 3 4 5 |
PUT /{index}/{type}/{id} { "field": "value", ... } |
如果不传入ID则elasticsearch采用UUID作为主键。
获取数据(GET)
1 |
GET /website/blog/123?pretty |
可以使用pretty关键字美化json
检索文档的一部分
通常,GET请求将返回文档的全部,存储在_source参数中。但是可能你感兴趣的字段只是title。请求个别字段可以使用_source参数。多个字段可以使用逗号分隔:
数据是否存在(HEAD)
如果你想做的只是检查文档是否存在——你对内容完全不感兴趣——使用HEAD方法来代替GET。HEAD请求不会返回响应体,只有HTTP头:
curl -i -XHEAD http://localhost:9200/website/blog/123存在返回200不存在则返回404
更新数据
文档在Elasticsearch中是不可变的——我们不能修改他们。如果需要更新已存在的文档,我们可以使用《索引文档》章节提到的index API 重建索引(reindex) 或者替换掉它。
创建新的数据
当索引一个文档,我们如何确定是完全创建了一个新的还是覆盖了一个已经存在的呢?
请记住_index、_type、_id三者唯一确定一个文档。所以要想保证文档是新加入的,最简单的方式是使用POST方法让Elasticsearch自动生成唯一_id:
POST /website/blog/{ … }
然而,如果想使用自定义的_id,我们必须告诉Elasticsearch应该在_index、_type、_id三者都不同时才接受请求。为了做到这点有两种方法,它们其实做的是同一件事情。你可以选择适合自己的方式:
如果请求成功的创建了一个新文档,Elasticsearch将返回正常的元数据且响应状态码是201 Created
。
另一方面,如果包含相同的_index
、_type
和_id
的文档已经存在,Elasticsearch将返回409 Conflict
响应状态码,错误信息类似如下:
删除文档(DELETE)
删除文档的语法模式与之前基本一致,只不过要使用DELETE方法:
锁
Elasticsearch采用乐观锁,每个文档都有一个version,我们可以在修改数据时指定版本,如
然而,如果我们重新运行相同的索引请求,依旧指定version=1,Elasticsearch将返回409 Conflict状态的HTTP响应。响应体类似这样:
这告诉我们当前_version是2,但是我们指定想要更新的版本是1。我们需要做什么取决于程序的需求。我们可以告知用户其他人修改了文档,你应该在保存前再看一下。而对于上文提到的商品stock_count,我们需要重新检索最新文档然后申请新的更改操作。
所有更新和删除文档的请求都接受version参数,它可以允许在你的代码中增加乐观锁控制。
使用外部版本控制系统
一种常见的结构是使用一些其他的数据库做为主数据库,然后使用Elasticsearch搜索数据,这意味着所有主数据库发生变化,就要将其拷贝到Elasticsearch中。如果有多个进程负责这些数据的同步,就会遇到上面提到的并发问题。
如果主数据库有版本字段——或一些类似于timestamp等可以用于版本控制的字段——是你就可以在Elasticsearch的查询字符串后面添加version_type=external来使用这些版本号。版本号必须是整数,大于零小于9.2e+18——Java中的正的long。
1
外部版本号与之前说的内部版本号在处理的时候有些不同。它不再检查_version是否与请求中指定的一致,而是检查是否小于指定的版本。如果请求成功,外部版本号就会被存储到_version中。
外部版本号不仅在索引和删除请求中指定,也可以在创建(create)新文档中指定。
例如,创建一个包含外部版本号5的新博客,我们可以这样做:
局部更新
可以使用_update向文档内更新局部信息
检索多个文档
无论是否检索到文档都会返回200而不是404以为mget请求成功了,如果判断是否匹配到数据需要found
请求
响应
批处理
Bulk
发表评论