我从源文档开始,如下所示:
"books" : [
{
"title" : "book one",
"editor" : "me",
"chapters" : [
{
"number" : "one",
"author" : "first author"
},
{
"number" : "two",
"author" : "second author"
}
]
},
...
]
导入我的初始数据后,我想添加一个字段(' pdf'类型'附件')到每个章节'。 < pdf',顾名思义,是完整章节的pdf。
如何使用ElasticSearch持久性模型进行设置?特别, - 映射,和 - 更新
答案 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,但我不知道如何在现有的情况下进行操作。