Elasticsearch Rails持久性模型:如何更新嵌套对象?

时间:2015-04-20 23:05:58

标签: ruby-on-rails elasticsearch

我从源文档开始,如下所示:

"books" : [
  { 
    "title" : "book one", 
    "editor" : "me",
    "chapters" : [
      {
        "number" : "one",
        "author" : "first author"
      },
      {
        "number" : "two",
        "author" : "second author"
      }
    ]
  },
 ...
]

导入我的初始数据后,我想添加一个字段(' pdf'类型'附件')到每个章节'。 < pdf',顾名思义,是完整章节的pdf。

如何使用ElasticSearch持久性模型进行设置?特别, - 映射,和 - 更新

1 个答案:

答案 0 :(得分:1)

所以这里有两个问题,索引pdf附件,并更新“子”对象。就pdf而言,我建议您查看attachment types的文档。但是,一旦你设置了插件,你就应该能够以任何方式更新现有文档。

使用您列出的设置,您必须更新整个文档以向每个子文档添加更新。我假设这不是你想要做的,所以你可能想要使用parent/child relationship

我将使用您列出的对象结构为您提供一个基本示例。

我可以设置一个包含两个映射的索引,一个父项和一个子项,如下所示:

PUT /test_index
{
   "mappings": {
      "book": {
         "properties": {
            "title": {
               "type": "string"
            },
            "editor": {
               "type": "string"
            }
         }
      },
      "chapter": {
         "_parent": {
            "type": "book"
         },
         "properties": {
            "number": {
               "type": "string"
            },
            "author": {
               "type": "string"
            }
         }
      }
   }
}

然后我可以使用bulk API索引某些文档,如下所示:

POST /test_index/_bulk
{"index":{"_type":"book","_id":1}}
{"title":"book one","editor" : "me"}
{"index":{"_type":"chapter","_id":1,"_parent":1}}
{"number":"one","author":"first author"}
{"index":{"_type":"chapter","_id":2,"_parent":1}}
{"number":"two","author":"second author"}

现在,如果我想更新子文档而不更改现有属性,我可以使用update API并传递部分文档:

POST /test_index/chapter/2/_update?parent=1
{
   "doc": {
      "another_field": "just text for illustration"
   }
}

请注意,我在请求中传递了父ID;这样ES就可以适当地路由请求,如here所示。

我没有尝试索引pdf附件,但是一旦安装了插件,它应该以相同的方式工作。

以下是我用来测试的代码:

http://sense.qbox.io/gist/c2f7b676e27798bed4d910de03b537fd9f15de2d

编辑:我刚才意识到我在Rails中没有说过这么做。我实际上并不了解那部分内容。我相信有一种方法可以将我在此处显示的REST请求转换为Rails,但我不知道如何在现有的情况下进行操作。