更新 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