更新 ElasticSearch 文档列表中对象的 属性?
Updating a property of an object in a list in ElasticSearch document?
我对 ElasticSearch 还很陌生。我在 .NET 项目中使用它,并且使用 NEST 客户端。现在我正在研究处理文档更新的方法。
我有一个如下所示的文档:
public class Class1
{
public string Prop1 { get; set; }
public string Prop2 { get; set; }
public List<Class2> PropList { get; set; }
}
当我想向 PropList 添加内容时,我是通过脚本来完成的:
client.Update<Class1>(x => x
.Id(1)
.Index("index_name")
.Script("ctx._source.propList += prop")
.Params(p => p.Add("prop", newProp)));
现在效果很好。问题是当我想更新 propList 中对象的 属性 时。我现在的做法是检索整个文档,在列表中找到对象,更新 属性 并再次索引整个文档,这在某些时候可能会导致性能问题。
有没有更有效的方法?也许使用脚本或其他方式?
谢谢。
我不知道如何用 nest 设置它,副手,但我会选择 parent/child relationship。
作为玩具示例,我使用此映射设置索引:
PUT /test_index
{
"mappings": {
"parent_type": {
"properties": {
"num_prop": {
"type": "integer"
},
"str_prop": {
"type": "string"
}
}
},
"child_type": {
"_parent": {
"type": "parent_type"
},
"properties": {
"child_num": {
"type": "integer"
},
"child_str": {
"type": "string"
}
}
}
}
}
然后添加了一些数据:
POST /test_index/_bulk
{"index":{"_type":"parent_type","_id":1}}
{"num_prop":1,"str_prop":"hello"}
{"index":{"_type":"child_type","_id":1,"_parent":1}}
{"child_num":11,"child_str":"foo"}
{"index":{"_type":"child_type","_id":2,"_parent":1}}
{"child_num":12,"child_str":"bar"}
{"index":{"_type":"parent_type","_id":2}}
{"num_prop":2,"str_prop":"goodbye"}
{"index":{"_type":"child_type","_id":3,"_parent":2}}
{"child_num":21,"child_str":"baz"}
现在,如果我想更新子文档,我可以 post 一个新版本:
POST /test_index/child_type/2?parent=1
{
"child_num": 13,
"child_str": "bars"
}
(请注意,我必须提供父 ID,以便 ES 可以适当地 route the request)
如果需要,我也可以进行部分脚本更新:
POST /test_index/child_type/3/_update?parent=2
{
"script": "ctx._source.child_num+=1"
}
我们可以通过搜索子类型来证明这是有效的:
POST /test_index/child_type/_search
...
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 3,
"max_score": 1,
"hits": [
{
"_index": "test_index",
"_type": "child_type",
"_id": "1",
"_score": 1,
"_source": {
"child_num": 11,
"child_str": "foo"
}
},
{
"_index": "test_index",
"_type": "child_type",
"_id": "2",
"_score": 1,
"_source": {
"child_num": 13,
"child_str": "bars"
}
},
{
"_index": "test_index",
"_type": "child_type",
"_id": "3",
"_score": 1,
"_source": {
"child_num": 22,
"child_str": "baz"
}
}
]
}
}
希望这对您有所帮助。这是我使用的代码,再加上几个例子:
http://sense.qbox.io/gist/73f6d2f347a08bfe0c254a977a4a05a68d2f3a8d
我对 ElasticSearch 还很陌生。我在 .NET 项目中使用它,并且使用 NEST 客户端。现在我正在研究处理文档更新的方法。
我有一个如下所示的文档:
public class Class1
{
public string Prop1 { get; set; }
public string Prop2 { get; set; }
public List<Class2> PropList { get; set; }
}
当我想向 PropList 添加内容时,我是通过脚本来完成的:
client.Update<Class1>(x => x
.Id(1)
.Index("index_name")
.Script("ctx._source.propList += prop")
.Params(p => p.Add("prop", newProp)));
现在效果很好。问题是当我想更新 propList 中对象的 属性 时。我现在的做法是检索整个文档,在列表中找到对象,更新 属性 并再次索引整个文档,这在某些时候可能会导致性能问题。
有没有更有效的方法?也许使用脚本或其他方式?
谢谢。
我不知道如何用 nest 设置它,副手,但我会选择 parent/child relationship。
作为玩具示例,我使用此映射设置索引:
PUT /test_index
{
"mappings": {
"parent_type": {
"properties": {
"num_prop": {
"type": "integer"
},
"str_prop": {
"type": "string"
}
}
},
"child_type": {
"_parent": {
"type": "parent_type"
},
"properties": {
"child_num": {
"type": "integer"
},
"child_str": {
"type": "string"
}
}
}
}
}
然后添加了一些数据:
POST /test_index/_bulk
{"index":{"_type":"parent_type","_id":1}}
{"num_prop":1,"str_prop":"hello"}
{"index":{"_type":"child_type","_id":1,"_parent":1}}
{"child_num":11,"child_str":"foo"}
{"index":{"_type":"child_type","_id":2,"_parent":1}}
{"child_num":12,"child_str":"bar"}
{"index":{"_type":"parent_type","_id":2}}
{"num_prop":2,"str_prop":"goodbye"}
{"index":{"_type":"child_type","_id":3,"_parent":2}}
{"child_num":21,"child_str":"baz"}
现在,如果我想更新子文档,我可以 post 一个新版本:
POST /test_index/child_type/2?parent=1
{
"child_num": 13,
"child_str": "bars"
}
(请注意,我必须提供父 ID,以便 ES 可以适当地 route the request)
如果需要,我也可以进行部分脚本更新:
POST /test_index/child_type/3/_update?parent=2
{
"script": "ctx._source.child_num+=1"
}
我们可以通过搜索子类型来证明这是有效的:
POST /test_index/child_type/_search
...
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 3,
"max_score": 1,
"hits": [
{
"_index": "test_index",
"_type": "child_type",
"_id": "1",
"_score": 1,
"_source": {
"child_num": 11,
"child_str": "foo"
}
},
{
"_index": "test_index",
"_type": "child_type",
"_id": "2",
"_score": 1,
"_source": {
"child_num": 13,
"child_str": "bars"
}
},
{
"_index": "test_index",
"_type": "child_type",
"_id": "3",
"_score": 1,
"_source": {
"child_num": 22,
"child_str": "baz"
}
}
]
}
}
希望这对您有所帮助。这是我使用的代码,再加上几个例子:
http://sense.qbox.io/gist/73f6d2f347a08bfe0c254a977a4a05a68d2f3a8d