数据操作
1.增 - 创建索引,添加数据
新增索引(建表):
直接创建索引 :ES已设置了很多简单可用的默认配置,所以可以直接使用它默认的配置创建一个索引。它还具有动态映射的功能,它会在新增数据时,根据插入的数据,设置合适的类型。
直接创建索引,通过RestFull操作,直接插入一条数据。
PUT /index1/type1/1
{
"name": "Tom",
"age": 20
}
使用命令 GET /index1/
查看下索引的信息,如果你不希望开启自动创建索引可以通过修改 config/elasticsearch.yml
文件,添加以下配置后重启
action.auto_create_index: false
{
"index1": { #索引名
"aliases": {}, #配置的别名
"mappings": { #映射信息
"type1": { #类型
"properties": { #属性配置
"age": { #属性名
"type": "long" #属性类型
},
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
},
"settings": { #设置
"index": {
"creation_date": "1524675885463",
"number_of_shards": "5", #主分片数
"number_of_replicas": "1", #复制分片数
"uuid": "thaVTS9ZTrmgj9BzgahpTw",
"version": {
"created": "5060899"
},
"provided_name": "index1"
}
}
}
}
自己设置索引:假如现在我们需要对这个建立索引的过程做更多的控制:我们想要确定这个索引的主分片数,复制分片数,并且在我们索引任何数据 之前 ,分析器和映射已经被建立好。这就需要文件在创建时的请求体中,带上配置和映射映射参数配置
PUT /index2 #索引名称
{
"settings": { #设置信息
"number_of_shards": 3, #主分片为3
"number_of_replicas": 0 #复制分片数0
},
"mappings": { #映射信息
"type1":{ #类型
"_source": {"enabled": false}, #取消_source
"properties": { #属性
"name":{
"type": "text", #设置为text类型
"analyzer": "standard" #配置分词器
},
"birth":{
"type": "date", #设置为date类型
"format": "yyyy-MM-dd" #保存的格式
}
}
}
}
}
新增数据(insert):
使用自定义的ID
ES中使用一个文档的 _index 、 _type 和 _id 唯一标识一个文档,我们可以在插入数据是自己确定它们。
PUT /{index}/{type}/{id}
{
"field": "value",
...
}
注意:因为更新的语法与新增的语法是一样的,这样你就不能确定你到底是新增了还是将原先数据修改了。你有两种方法来保证是新增的,分别是通过在后面添加op_type=create或_create参数.
PUT /{index}/{type}/{id}?op_type=create | _create
{...}
假如原先此id的值不存在,则会返回201 Created的响应码。
假如原先值存在,则返回 409 Conflict 的响应码
自动生成ID
ES可以自动帮我们生成id,除了不需要指定id,插入语法与前面一致,这边不再使用PUT而使用POST谓词
POST /{index}/{type}/
{...}
2.改 - 修改索引,修改文档
修改索引(设计表):
因为映射在新建索引的指定,我们不能够修改一个已经创建的属性的映射,只能添加新属性的映射。如果需要修改,可以新建一个新索引,然后将数据迁移过去,使用别名操作(alias)可以完成不影响集群使用的情况下完成索引切换。设置方面,主分片数是不能修改的。因为实际数据是存在一个个分片上的,在保存文档时ES根据主分片的数量通过一个简单的路由算法计算应把数据放到哪个分片上。如果修改了主分片数那么原先的路由值就全错了,文档也就找不到了。
我们可以修改索引的复制分片数量,因为复制分片也可以响应查询操作,所以合理的增加复制分片的数量,可以减少响应时间。增大了冗余量,也减少了了数据丢失的可能性。
PUT /{index}/_settings
{
"number_of_replicas" : 0
}
修改数据(update):
我们先插入一条数据,查看返回值
PUT /index1/type1/1
{
"name":"tom",
"age": 18
}
{
"_index": "index1",
"_type": "type1",
"_id": "1",
"_version": 1, #默认version1
"result": "created", #表示新增
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": true #表示新建成功
}
然后修改数据,查看返回值
PUT /index1/type1/1
{
"name":"tom2", #修改了名字
"birth":"1995-03-13" #增加了出生时间
}
返回值,可以看到它的_version 变成了2 ,result变成了update,create 变成了 false
{
"_index": "index1",
"_type": "type1",
"_id": "1",
"_version": 2,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": false
}
然后看下查看文档数据GET index1/type1/1/_source
,我们可以看到name被修改,birth被新增,但age不见了。
这是因为在Elasticsearch中Update操作实际是这样的: 先将旧文档标记为已删除,虽然我们不能再进行访问,但它并不会立即消失。然后ES会新增一个全新的文档,当继续索引更多的数据,Elasticsearch 会在后台清理这些已删除文档。
{
"name": "tom2",
"birth": "1995-03-13"
}
如果我们想要实现局部更新,我们可以用下面的语法。
POST /index1/type1/1/_update
{
"doc":{
"name":"tom",
"age":20
}
}
我们可以看到birth并没有被删除,说明确实是修改而不是覆盖
{
"name": "tom",
"birth": "1995-03-13",
"age":20
}
3.查 - 查看索引,获取文档
查看索引(查看表结构):
通过GET /index1/_settings
和GET /index1/_mapping
可以查看索引的配置和映射。
查看数据(select):
返回某个id的文档
GET {index}/{type}/{id}
还有两种搜索API:轻度搜索和结构化搜索
轻度搜索:
查询name中包含tom的文档
GET /[index]/[type]/_search?q=name:tom
查询包含tom的文档
GET /[index]/[type]/_search?q=tom
结构化搜索:使用json格式构建查询体
查询name中包含tom的文档
GET /_search
{
"query": {
"match": {
"name": "tom"
}
}
}
使用元数据_all来查询包含tom的文档
GET /_search
{
"query": {
"match": {
"_all": "tom"
}
}
}
查询类型有很多,可查看查询种类汇总
4.删 - 删除索引,删除文档
删除操作只需要使用Delate谓词,后面指定你想删除的数据,支持通配符
DELETE /{index}/{type}/{id}
官方API文档: https://www.elastic.co/guide/en/elasticsearch/reference/5.6/index.html
官方中文指南:https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html