ElasticSearch嵌套数组部分更新

时间:2015-08-20 23:55:25

标签: json search plugins elasticsearch

我有这个特殊的对象,其中包含my_array:

"description": "My Object Description",
"my_array": [
  {
    "id": 1000,
    "name": "abc",
    "url" : "abc.html",
    "content": "somebig content"
  },
  {
    "id": 1001,
    "name": "def",
    "url" : "def.html",
    "content": "somebig content"
  },
  {
    "id": 1002,
    "name": "xyz",
     "url" : "xyz.html",
     "content": "somebig content"
  } ]

数组中的每个元素都包含一个url。现在每当这个对象发生变化时,我都有一个任务,它会触发数组中每个元素的url,获取该元素的html内容,并创建可以索引到elasticsearch的请求文档。

可以说,无法访问id = 1001的url,并且无法访问此元素的内容。我仍然希望继续处理元素1000和1002的更改。在这种情况下,我的更新将如下所示:

  "description": "My New Object Description",
    "my_array": [
      {
        "id": 1000,
        "name": "abc",
        "url" : "abc-new-url.html",
        "content": "some modified content"
      },
      {
        "id": 1002,
        "name": "xyz",
         "url" : "xyz-new-url.html",
         "content": "some modified content"
      } ]

如果我将此部分更新发送到elasticsearch,则会更新集合,但会从集合中删除元素1001。

我的问题是如何在不触及1001的情况下有选择地更新元素1000和1002.索引在1001处于陈旧状态对我来说没问题。一个显而易见的选择是从elasticsearch获取现有文档,并在执行更新之前手动进行合并。是否可以执行此部分更新?

另一个问题是,有没有办法只将url发送到elasticsearch,并编写一个插件来在索引时获取html内容,而不是事先做好?

2 个答案:

答案 0 :(得分:0)

我认为您可以使用更新查询中的脚本来解决此问题,请在此处查看以下答案: remove objects from array elastic search

答案 1 :(得分:-1)

您无法使用Elasticsearch本机API进行此类更新。但是,如果您不想在应用程序级别手动合并更新的内容,可能的解决方案是将数组的每个元素存储在与原始文档具有相同索引但文档类型不同的文档中。

然后分别对这些元素中的每一个(在本例中为文档)进行更新