elfia_akira
elfia_akira

Reputation: 5

Turned off the dynamic mapping in Elasticsearch, but the custom mapping still not work?

my problem is: I have a JsonObject like this:

{
    "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"
        },
       {...}
      ]
    }
}

And I tried to define a mapping as follows to index only parts of this object.

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();

after adding this mapping into my type with:

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

I still got all of the jsonobject in my indexresponse, it seems that my mapping does not work.

Could anybody help me? Thanks a lot!

Upvotes: 0

Views: 2395

Answers (1)

javanna
javanna

Reputation: 60205

The problem here is that using static mapping only means that fields that are not already present in the mapping won't be added to it, thus won't be indexed either. But as they are part of the source document that you sent, they are returned as part of the _source field.

Same goes if you disable a specific object in the mapping ("enable":false) as mentioned here. That object won't be parsed nor indexed, but will still be part of the stored _source field.

If you want to avoid storing part of the _source you can use the source includes/excludes feature as described here.

Upvotes: 1

Related Questions