【Elasticsearch7.0】之修改文档

star2017 1年前 ⋅ 605 阅读

接下来讲讲如何修改数据。

es提供数据操作和近实时搜索能力。创建索引、更新你的数据、删除你的数据之后会有1秒钟延迟。这个跟关系型数据库有所区别。

替换文档

我们之前使用下面的命令来创建文档。创建了id为1的文档。

PUT /user/_doc/1?pretty
{
  "name": "张三"
}

如果再次执行上面的命令,那么es会替换之前的文档,

PUT /user/_doc/1?pretty
{
  "name": "李四"
}

那么会把张三替换为李四,
如果我们使用不同的id,那么es会创建新的文档,但是不影响之前的数据。

PUT /user/_doc/2?pretty

{
  "name": "王五"
}

上面的命令生成了id为2的文档。

创建文档时,id是可选的,如果没有指定id,那么es会自动生成一个随机的唯一id。自动生成的id会在查询的时候返回。

POST /user/_doc?pretty
{
    "name":"李白"
}

注意,这里使用POST命令。
返回值

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

更新文档

除了索引文档和替换文档之外,还可以更新文档。es在底层并不是去做更新操作,而是删除老的文档,新建一个文档。
让我们来看下更新文档的例子:

POST /user/_update/1
{
    "doc": {
	"name": "小王"
    }
}

也可以添加其他属性,像age是新增的属性。

POST /user/_update/1
{
    "doc": {
	"name": "小王",
        "age":30
    }
}

可以使用简单的脚本来更新文档。如给年龄加5。

POST /user/_update/1
{
"script":"ctx._source.age+=5"
}

上面的例子,通过ctx._source来获取原数据。

es也可以根据查询条件来更新某个属性。

POST /user/_update_by_query
{
	"script":"ctx._source.name=100",
	"query":{
		"term":{
			"name":"77777"
		}
	}
}

删除文档

删除文档非常简单,看下面的例子:

DELETE /user/_doc/1

返回值

{
    "_index": "user",
    "_type": "_doc",
    "_id": "1",
    "_version": 9,
    "result": "deleted",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 8,
    "_primary_term": 1
}

从result看状态为deleted。表示已经删除了。可以通过_delete_by_query接口来根据条件删除。删除整个索引的性能要比根据条件删除所有文档的性能要高。

批处理

除了提供单个文档的创建、修改、删除操作外,es还支持通过_bulk接口批量创建、修改、删除文档操作。该操作可以减少网络io请求。
批量创建索引

POST /user/_bulk
{"index":{"_id":3}}
{"name":"小张"}
{"index":{"_id":4}}
{"name":"小李"}

image.png
使用上面的接口,发现The bulk request must be terminated by a newline错误。
image.png
需要在json结束之后,加一个空格,这样就可以执行成功了。

{
    "took": 11,
    "errors": false,
    "items": [
        {
            "index": {
                "_index": "user",
                "_type": "_doc",
                "_id": "1",
                "_version": 4,
                "result": "updated",
                "_shards": {
                    "total": 2,
                    "successful": 1,
                    "failed": 0
                },
                "_seq_no": 14,
                "_primary_term": 2,
                "status": 200
            }
        },
        {
            "index": {
                "_index": "user",
                "_type": "_doc",
                "_id": "2",
                "_version": 3,
                "result": "updated",
                "_shards": {
                    "total": 2,
                    "successful": 1,
                    "failed": 0
                },
                "_seq_no": 15,
                "_primary_term": 2,
                "status": 200
            }
        }
    ]
}

批量修改和删除文档

POST /user/_bulk?pretty
{"update":{"_id":"1"}}
{"doc": {"name":"John Doe"} }
{"delete":{"_id":"2"}}

返回值

{
    "took": 98,
    "errors": false,
    "items": [
        {
            "update": {
                "_index": "user",
                "_type": "_doc",
                "_id": "1",
                "_version": 4,
                "result": "noop",
                "_shards": {
                    "total": 2,
                    "successful": 1,
                    "failed": 0
                },
                "status": 200
            }
        },
        {
            "delete": {
                "_index": "user",
                "_type": "_doc",
                "_id": "2",
                "_version": 4,
                "result": "deleted",
                "_shards": {
                    "total": 2,
                    "successful": 1,
                    "failed": 0
                },
                "_seq_no": 16,
                "_primary_term": 2,
                "status": 200
            }
        }
    ]
}

上面的删除操作,只需要根据文档id删除。

Bulk接口不会因为某个操作失败而失败。如果某个操作因为某些原因失败了,Bulk将继续执行下面的操作。当Bulk执行完成之后,会根据执行顺序返回执行状态,方便查询操作是否成功。

本文为博主原创文章,未经博主允许不得转载。
更多内容请访问:IT源点

相关文章推荐

全部评论: 0

    我有话说: