更新对象的属性在ElasticSearch文件列表?(Updating a property of

2019-10-22 16:41发布

我是相当新的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这样一个对象的属性。 我这样做是正确的,现在的方式是通过检索整个文档,查找对象列表,更新属性并重新索引整个文件,这在某些时候可能会导致性能问题。

有没有更有效地这样做的呢? 也许使用脚本或一些其他的方式?

谢谢。

Answer 1:

我不知道如何与嵌套设置它,离手,但我会去一个父/子关系 。

作为玩具例如,我建立与这个映射的索引:

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



文章来源: Updating a property of an object in a list in ElasticSearch document?