我是相当新的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这样一个对象的属性。 我这样做是正确的,现在的方式是通过检索整个文档,查找对象列表,更新属性并重新索引整个文件,这在某些时候可能会导致性能问题。
有没有更有效地这样做的呢? 也许使用脚本或一些其他的方式?
谢谢。
我不知道如何与嵌套设置它,离手,但我会去一个父/子关系 。
作为玩具例如,我建立与这个映射的索引:
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 /test_index/child_type/2?parent=1
{
"child_num": 13,
"child_str": "bars"
}
(请注意,我必须提供父ID所以ES可以将该请求路由适当)
我还可以做的部分,脚本更新,如果我想:
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