我正在尝试存储文档' 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'。但这个解决方案显然不是我想采取的道路......
所以我想知道这个问题的好方法是什么,如果有的话。
答案 0 :(得分:0)
在大多数情况下,第一个命题是最好的,但是当您需要为其他字段进行动态映射时,第二个解决方案是最简单的(创建一个禁用动态映射的子字段,同时在root中保持启用它对象)。
1)使用inner
设置创建dynamic:"false"
对象字段:
POST dynamic
{
"mappings": {
"test": {
"properties": {
"inner": {
"type": "object",
"dynamic": false
}
}
}
}
}
2)添加一些值进行测试(同时动态创建new_string
和new_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_string
和new_long
字段映射:
"dynamic": {
"mappings": {
"test": {
"properties": {
"inner": {
"type": "object",
"dynamic": "false"
},
"new_long": {
"type": "long"
},
"new_string": {
"type": "string"
}
}
}
}
}