关闭Elasticsearch中的动态映射,但自定义映射仍然不起作用?

时间:2013-08-27 10:14:54

标签: dynamic indexing mapping elasticsearch

我的问题是:我有一个像这样的JsonObject:

{
    "success": true,
    "type": "message",
    "body": {
    "_id": "5215bdd32de81e0c0f000005",
        "id": "411c79eb-a725-4ad9-9d82-2db54dfc80ee",
        "type": "metaModel",
        "title": "testchang",
        "authorId": "5215bd552de81e0c0f000001",
        "drawElems": [
        {
            "type": "App.draw.metaElem.ModelStartPhase",
            "id": "27re7e35-550j",
            "x": 60,
            "y": 50,
            "width": 50,
            "height": 50,
            "title": "problem engagement",
            "isGhost": true,
            "pointTo": "e88e2845-37a4-4c45-a030-d02a3c3e03f9",
            "bindingId": "90f79d70-0afc-11e3-98d2-83967d2ad9a6",
            "model": "meta",
            "entityType": "phase",
            "domainId": "411c79eb-a725-4ad9-9d82-2db54dfc80ee",
            "authorId": "5215bd552de81e0c0f000001",
            "userData": {},
            "_id": "5215f4c5d89f629c1700000d"
        },
       {...}
      ]
    }
}

我尝试按如下方式定义映射,仅索引此对象的部分内容。

String mapping = XContentFactory.jsonBuilder()
                    .startObject()
                    .startObject("domaindata").field("dynamic","false")
                    .startObject("properties")
                            .startObject("id").field("type","string").field("store","yes").endObject()
                           .startObject("type").field("type","string").field("store","yes").endObject()
                            .startObject("title").field("type","integer").field("store","yes").endObject()
.startObject("drawElems")
.startObject("properties")
                             .startObject("type").field("store","yes").field("type","string").endObject()
                                 .startObject("title").field("store","yes").field("type","string").endObject()
.endObject().endObject().endObject().endObject().endObject().string();

将此映射添加到我的类型后:

node.client().admin()
                .indices().prepareCreate("test")
                .addMapping("domaindata", mapping)
                .execute().actionGet();

我仍然在我的indexresponse中获得了所有jsonobject,似乎我的映射不起作用。

有人能帮帮我吗?非常感谢!

1 个答案:

答案 0 :(得分:1)

这里的问题是,使用静态映射只意味着映射中不存在的字段不会被添加到其中,因此也不会被索引。但由于它们是您发送的源文档的一部分,因此它们将作为_source字段的一部分返回。

如果您按照here所述禁用映射("enable":false)中的特定对象,也是如此。该对象不会被解析也不会被索引,但仍然是存储的_source字段的一部分。

如果您想避免存储部分_source,可以使用here所述的来源包含/排除功能。