我有弹性搜索索引,里面有不同的类型。 每种类型都包含一些默认字段和一些基于类型的额外字段。 每种类型都有位置对象,存储lat和lon。 我在弹性搜索索引中的示例数据是
[{
"_index": "es_index",
"_type": "type1",
"_id": "id1",
"_source": {
"name": "name",
"type1field": "value",
"location": {
"lat": 1,
"lon": 1
}
}
}, {
"_index": "es_index",
"_type": "type2",
"_id": "id2",
"_source": {
"name": "name",
"type2field": "value",
"location": {
"lat": 1,
"lon": 1
}
}
}]
我能够通过" sense"创建具有相同映射的索引。但是从java应用程序中获取错误。
我正在使用" org.springframework.data.elasticsearch.core.ElasticsearchTemplate"用于从我的Java应用程序创建弹性搜索索引。
我使用相同的ElasticsearchTemplate来保存和查询数据。
为具有不同映射文件的所有不同类型创建索引时,它是成功的但是在保存数据时,我收到错误
java.lang.IllegalArgumentException: [location] is defined as an object in mapping [esIndex] but this name is already used for a field in other types
我有" location"在所有类型
"location": {
"geohash": true,
"lat_lon": true,
"store": true,
"type": "geo_point"
}
仅供参考 - 这是我的es_index映射
{
"es_index": {
"aliases": {
"es_index1": {}
},
"mappings": {
"type1": {
"properties": {
"field1": {
"type": "string",
"analyzer": "nGram_analyzer",
"search_analyzer": "whitespace_analyzer"
},
"field2": {
"type": "string",
"index": "no"
},
"field3": {
"type": "string",
"analyzer": "nGram_analyzer",
"search_analyzer": "whitespace_analyzer"
},
"field4": {
"type": "string",
"index": "no"
},
"location": {
"type": "geo_point",
"store": true,
"lat_lon": true,
"geohash": true
}
}
},
"type2": {
"properties": {
"field1": {
"type": "string",
"analyzer": "nGram_analyzer",
"search_analyzer": "whitespace_analyzer"
},
"field5": {
"type": "string",
"analyzer": "nGram_analyzer",
"search_analyzer": "whitespace_analyzer",
"include_in_all": true
},
"field4": {
"type": "string",
"index": "no"
},
"location": {
"type": "geo_point",
"store": true,
"lat_lon": true,
"geohash": true
},
"field6": {
"type": "string",
"index": "no"
}
}
}
},
"settings": {
"index": {
"creation_date": "1491466792565",
"include_in_all": "false",
"uuid": "uuid....",
"number_of_replicas": "1",
"analysis": {
"filter": {
"nGram_filter": {
"max_gram": "75",
"type": "edgeNGram",
"min_gram": "2",
"token_chars": [
"letter",
"digit",
"punctuation",
"symbol"
]
}
},
"analyzer": {
"nGram_analyzer": {
"type": "custom",
"filter": [
"lowercase",
"asciifolding",
"nGram_filter"
],
"tokenizer": "keyword"
},
"whitespace_analyzer": {
"type": "custom",
"filter": [
"lowercase",
"asciifolding"
],
"tokenizer": "keyword"
}
}
},
"number_of_shards": "8",
"version": {
"created": "2040499"
}
}
},
"warmers": {}
}
}
它是什么原因以及如何解决?
答案 0 :(得分:0)
错误消息表明您尝试在同一索引中以两种不同的方式(在不同的文档类型中)映射相同的字段名称。
您无法在同一索引中以两种不同的方式映射字段。
例如,如果你有......
"mappings": {
"books": {
"properties":{
"title":{
"type":"text"
},
...
你以后不能拥有相同的索引...
"films": {
"properties":{
"title":{
"type":"keyword"
}
}
标题字段在索引中只有一个映射定义。
标题字段为索引中的所有类型共享。
类型与数据库表不同。
如果您遇到这种情况,您有三种选择:
使索引中所有文档类型的位置字段的映射相同。 (对于类似位置的东西,这似乎是一个好主意。)
在不同的文档类型中使用不同的字段名称作为位置。
对需要不同位置映射定义的文档类型使用单独的索引。
如果这只是动态映射进入并损坏索引的情况,那么请考虑将其关闭。想象一下,在生产中发生这种情况会多么快乐。