Elasticsearch映射:如何存储可能属于不同类型的非索引字段

时间:2015-09-15 08:17:37

标签: elasticsearch mapping

我正在尝试存储文档' doc'其中一个字段' doc.value'可以是不同的类型(浮点数,字符串,对象...)。我知道我无法将其编入索引,但我只是希望将其存储(不在doc.value上搜索,搜索将基于其他' doc'字段)。

我的第一个想法是使用' index / _type'处理它,但它似乎反对良好的做法,甚至不可能与ES 2.0(陈述here)。

我可以使用动态:false'设置' doc'级别并跳过“'值'我的映射声明中的字段;但是我需要' doc'中其他字段的动态行为。

我可以移动' doc.value'将字段转换为' doc.inner.value'并设置' doc.inner'用动态映射为对象:false&#39 ;;但在那种情况下;当我存储它们并检索它们时,我将不得不修改每个文档。

我看到的最后一个解决方案是创建自己的'类型' (例如' any_type')通过插件,我会映射' doc.value'这个' any_type'。但这个解决方案显然不是我想采取的道路......

所以我想知道这个问题的好方法是什么,如果有的话。

1 个答案:

答案 0 :(得分:0)

在大多数情况下,第一个命题是最好的,但是当您需要为其他字段进行动态映射时,第二个解决方案是最简单的(创建一个禁用动态映射的子字段,同时在root中保持启用它对象)。

1)使用inner设置创建dynamic:"false"对象字段:

POST dynamic
{
  "mappings": {
    "test": {
      "properties": {
        "inner": {
          "type": "object",
          "dynamic": false
        }
      }
    }
  }
}

2)添加一些值进行测试(同时动态创建new_stringnew_long等字段):

    PUT dynamic/test/1
    {
      "new_string":"lorem ipsum",
      "inner":{
        "sub_object":{
          "field1": "value1",
          "field2": 123
        }
      }
    }

    PUT dynamic/test/2
    {
      "new_long":1234,
      "inner":{
        "field3": "value2",
        "field4": 123
      }
    }

3)由于默认情况下存储文档的来源,并且它正是您提供给ElasticSearch的JSON文档,即使未编入索引或存储,您也会在响应中获得内部值:

"hits": [
             {
                "_index": "dynamic",
                "_type": "test",
                "_id": "1",
                "_score": 1,
                "_source": {
                   "new_string": "lorem ipsum",
                   "inner": {
                      "sub_object": {
                         "field1": "value1",
                         "field2": 123
                      }
                   }
                }
             },
             {
                "_index": "dynamic",
                "_type": "test",
                "_id": "2",
                "_score": 1,
                "_source": {
                   "new_long": 1234,
                   "inner": {
                      "field3": "value2",
                      "field4": 123
                   }
                }
             }
          ]

4)检查映射以查看是否已创建new_stringnew_long字段映射:

"dynamic": {
      "mappings": {
         "test": {
            "properties": {
               "inner": {
                  "type": "object",
                  "dynamic": "false"
               },
               "new_long": {
                  "type": "long"
               },
               "new_string": {
                  "type": "string"
               }
            }
         }
      }
   }