我的文件形式为:
curl -XPOST localhost:9200/books/book/1 -d '{
"user_id": 1,
"pages": [ {"page_id": 1, "count": 1}, {"page_id": 2, "count": 3}]
}
现在让我们说用户再次阅读第1页,所以我想增加计数。该文件应成为:
{
"user_id": 1,
"pages": [ {"page_id": 1, "count": 2}, {"page_id": 2, "count": 3}]
}
但是如何使用if变量更新列表元素?
Elasticsearch中的简单更新示例如下:
curl -XPOST localhost:9200/books/book/2 -d '{
"user_id": 1,
"pages": {
"page_1": 1,
"page_2": 2
}
}'
curl -XPOST localhost:9200/books/book/2/_update -d '
{
"script": "ctx._source.pages.page_1+=1"
}'
该文件现在变为:
{
"user_id": 1,
"pages": {
"page_1": 1,
"page_2": 2
}
然而,这种更简单的doc格式无法将page_id作为字段说明,因此id本身就是字段。类似地,与该字段相关联的值没有真正的定义。因此,这不是一个很好的解决方案。
无论如何,对于如何相应地更新数组或者有关数据结构的任何想法都有任何想法。
注意:使用ES 1.4.4,您还需要将script.disable_dynamic: false
添加到elasticsearch.yml
文件中。
答案 0 :(得分:1)
假设我正确理解你的问题,我可能会使用parent/child关系。
为了测试它,我设置了一个带有"user"
父级和"page"
子级的索引,如下所示:
PUT /test_index
{
"settings": {
"number_of_shards": 1
},
"mappings": {
"user": {
"_id": {
"path": "user_id"
},
"properties": {
"user_id": {
"type": "integer"
}
}
},
"page": {
"_parent": {
"type": "user"
},
"_id": {
"path": "page_id"
},
"properties": {
"page_id": {
"type": "integer"
},
"count": {
"type": "integer"
}
}
}
}
}
(我使用"path"
中的"_id"
参数,因为它使索引更少冗余; ES文档说ES {1.5}中不推荐使用path
,但它们不会说出它被替换的内容。)
然后索引了一些文档:
POST /test_index/_bulk
{"index":{"_type":"user"}}
{"user_id":1}
{"index":{"_type":"page","_parent":1}}
{"page_id":1,"count":1}
{"index":{"_type":"page","_parent":1}}
{"page_id":2,"count":1}
现在,我可以使用scripted partial update来增加"count"
的{{1}}字段。由于父/子关系,我必须使用page
parameter告诉ES如何路由请求。
parent
现在,如果我搜索该文档,我会看到它已按预期更新:
POST /test_index/page/2/_update?parent=1
{
"script": "ctx._source.count+=1"
}
以下是一个地方的代码:
http://sense.qbox.io/gist/9c977f15b514ec251aef8e84e9510d3de43aef8a