ElasticSearch基本操作之增加

版权声明:本文为博主原创文章,转载记得加链接。 https://blog.csdn.net/mythest/article/details/89406358

增加的操作一般使用

PUT或者POST twitter/_doc/1(或者不加id,使用默认id)
{
    "user" : "kimchy",
    "post_date" : "2009-11-15T14:12:12",
    "message" : "trying out Elasticsearch"
}```

但是一个简单的增加操作中,还有其他不经常用到但是比较重要的知识,都有哪些呢?

返回结果

返回结果一般长这样:

{
    "_shards" : {
        "total" : 2,
        "failed" : 0,
        "successful" : 1
    },
    "_index" : "twitter",
    "_type" : "_doc",
    "_id" : "1",
    "_version" : 1,
    "_seq_no" : 0,
    "_primary_term" : 1,
    "result" : "created"
}

其中shards需要注意,total标识es一共有几个分片,默认是两个,successful表示本次操作成功的分片有几个,一般一个节点维护一个分片,所以本次成功的分片只有一个。

自动创建索引

当创建记录时,如果索引不存在,则es会默认创建所需的索引。当然,是否自动创建索引以及自动创建什么样的索引,es也是可以设置的。
例如:

PUT _cluster/settings
{
    "persistent": {
        "action.auto_create_index": "twitter,index10,-index1*,+ind*" (false 或 true(默认))
    }
}

表示自动创建twitter和index10索引,不自动创建index1*之类的索引,但是会创建ind*之类的索引,也可以直接设置为false禁用自动创建索引。

操作类型

在创建记录时,可以指定操作类型op_type=create指定当记录已存在时,则返回错误。

自动生成id

当使用PUT方法创建记录时,则必须指定id。如果不想指定id,对id不关心,则可以使用POST方法,此时便可省略指定的id。
例如:

POST twitter/_doc/
{
    "user" : "kimchy",
    "post_date" : "2009-11-15T14:12:12",
    "message" : "trying out Elasticsearch"
}

每次操作需要等待执行完毕的分片数

在默认的创建记录的场景中,es只需等待主节点也就是primary分片创建成功后返回结果,无需等待其他分片操作完成,返回结果后,其他分片再从primary分片复制数据。
但,有时候为了数据安全起见,需要一定数量的分片数都执行完毕后才返回数据,这时候,设置index.write.wait_for_active_shards就排上用场了。
wait_for_active_shards的值不能大于你的总的分片数,也就是你创建记录返回结果中的total值。当然最好不要大于你的节点数,一般一个节点维护一份分片,为什么要这样呢?
举个例子,你是单节点部署的,只有一个节点,但是默认分片数是2,就像我们平常在本机上的那样,默认的wait_for_active_shards是1,如果我设置成3,那肯定要报错;如果设置成2,那也是有问题的,因为你只有一个节点,一个活动的分片,但是非要等到两个节点都ok才返回,那就很伤了,es会一直等直到超时或者有新的节点加进来才会返回结果。

refresh

增加记录时,参数refresh可以控制是否立即刷新,刷新可以使记录立即对查询可见,默认不设置,不设置就只能等待es每秒一次的自动刷新了。

超时

参数timeout=5m可以控制超时时间为5分钟,默认一分钟。

版本控制

在上面的返回结果中,有这样的一条信息:"_version" : 1,每次更改记录都会使记录的版本号+1,版本号有啥用呢?版本号一方面记录了你的更改次数,一方面还可以通过版本号回复某一版本的记录。
默认情况下,版本号是es自己管理的,也可以通过创建记录时的参数version=2&version_type=external手动控制版本号,version_type=external就表示版本号是来自外部,不是es自己的,注意这时候输入的版本号只能大于目前的记录的版本号。
version_type有多种取值,默认就是internal,es自己的;还有上面的external等价于external_gt;还有一种是external_gte,表示给定版本号大于等于当前版本号时才更新文档,需要注意的是,因为采用这种配置,本次记录更新了,但是版本号却不增长,有可能导致数据的异常或丢失。

无改动的更新

在默认情况下,使用

PUT(POST) twitter/_doc/1
{
    "user" : "kimchy",
    "post_date" : "2009-11-15T14:12:12",
    "message" : "trying out Elasticsearch"
}

会使版本号+1,尽管这次并没有改动。你很生气,没改动为什么还要+1,为了达到记录内容没更新版本号也不更新的目的,就需要使用专门的更新api.

5.x版本的更新操作:
127.0.0.1:9200/my_index/doc/1/_update
{
	"doc": {
		"name": "Jane Jane"
	}
}
6.x版本的更新操作:
127.0.0.1:9200/my_index/_update/1
{
	"doc": {
		"name": "Jane Jane"
	}
}

这时候实质内容不更新时,版本号就不会+1了。

展开阅读全文

没有更多推荐了,返回首页