我们正在从 ElasticSearch v7.6 和 OpenSearch v2.3 迁移我们的应用程序。因此,在此过程中,我们首先使用以下定义在 OpenSearch (2.3) 集群中创建索引模板 -
{
"order": 0,
"index_patterns": [
"note-management-1.0-*"
],
"settings": {
"index": {
"max_ngram_diff": "10",
"analysis": {
"filter": {
"ngram_filter": {
"type": "ngram",
"min_gram": "1",
"max_gram": "10"
}
},
"normalizer": {
"keyword_normalizer": {
"filter": [
"lowercase"
],
"type": "custom"
}
},
"analyzer": {
"text_analyzer": {
"filter": [
"lowercase",
"ngram_filter"
],
"type": "custom",
"tokenizer": "standard"
}
}
},
"number_of_shards": "5",
"number_of_replicas": "2"
}
},
"mappings": {
"properties": {
"owner": {
"copy_to": "permissionToView",
"type": "keyword"
},
"lastModifiedDate": {
"type": "date"
},
"contentReadOnly": {
"index": false,
"type": "boolean"
},
"lastModifiedBy": {
"index": false,
"type": "keyword"
},
"readOnly": {
"index": false,
"type": "boolean"
},
"title": {
"search_analyzer": "standard",
"analyzer": "text_analyzer",
"type": "text"
},
"permissionToView": {
"type": "keyword"
},
"version": {
"index": false,
"type": "long"
},
"content": {
"search_analyzer": "standard",
"analyzer": "text_analyzer",
"type": "text"
},
"tags": {
"normalizer": "keyword_normalizer",
"type": "keyword"
},
"noteType": {
"normalizer": "keyword_normalizer",
"type": "keyword"
},
"viewers": {
"copy_to": "permissionToView",
"index": false,
"type": "keyword"
},
"createdDate": {
"type": "date"
},
"externalObjects": {
"dynamic": false,
"type": "nested",
"properties": {
"displayName": {
"normalizer": "keyword_normalizer",
"type": "keyword"
},
"id": {
"normalizer": "keyword_normalizer",
"type": "keyword"
},
"type": {
"normalizer": "keyword_normalizer",
"type": "keyword"
},
"usersByPinned": {
"type": "keyword"
}
}
},
"deleters": {
"copy_to": "permissionToView",
"index": false,
"type": "keyword"
},
"id": {
"index": false,
"type": "keyword"
},
"outcome": {
"index": false,
"type": "keyword"
},
"editors": {
"copy_to": "permissionToView",
"index": false,
"type": "keyword"
}
}
},
"aliases": {
"note-management-1.0": {},
"note-management": {}
}
}
索引
note-management
尚未在 OpenSearch 中创建,预期一旦应用程序根据上面创建的模式创建第一个文档,就会隐式创建索引。
应用程序能够创建索引和文档,但我们无法使用现有应用程序检索它们,因为根据 OpenSearch,查询格式错误。
然后,我们删除了隐式创建的索引,并使用之前在 ElasticSearch v7.6 中创建的索引手动创建了它。之后,应用程序能够索引/查询文档,没有任何问题。
对于应用程序使用的查询以及使用 spring-boot-starter-data-elasticsearch 库生成的索引,问题似乎是当应用程序创建索引时,它不遵循使用的格式和约定OpenSearch模式,这会导致创建的索引格式不正确,以后无法查询。
如果有专家能给我们一些关于为什么会发生这种情况以及如何解决这个问题的指示,我们将不胜感激。
举个例子,当我们使用 spring-boot-starter-data-elasticsearch 2.4.11 创建索引时,隐式索引的定义为 -
{
"note-management" : {
"aliases" : { },
"mappings" : {
"properties" : {
"_class" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"content" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"contentReadOnly" : {
"type" : "boolean"
},
"createdDate" : {
"type" : "long"
},
"editors" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"id" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"lastModifiedBy" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"lastModifiedDate" : {
"type" : "long"
},
"noteType" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"owner" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"readOnly" : {
"type" : "boolean"
},
"title" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"version" : {
"type" : "long"
}
}
},
"settings" : {
"index" : {
"creation_date" : "1676061494880",
"number_of_shards" : "1",
"number_of_replicas" : "1",
"uuid" : "udj4QFKzSLSRyo8laD7vJA",
"version" : {
"created" : "135238227"
},
"provided_name" : "note-management"
}
}
}
}
这是错误的。
所以我们必须删除这个索引并使用正确的定义手动创建它,如下 -
{
"note-management" : {
"aliases" : { },
"mappings" : {
"properties" : {
"content" : {
"type" : "text",
"analyzer" : "text_analyzer",
"search_analyzer" : "standard"
},
"contentReadOnly" : {
"type" : "boolean",
"index" : false
},
"createdDate" : {
"type" : "date"
},
"deleters" : {
"type" : "keyword",
"index" : false,
"copy_to" : [
"permissionToView"
]
},
"editors" : {
"type" : "keyword",
"index" : false,
"copy_to" : [
"permissionToView"
]
},
"externalObjects" : {
"type" : "nested",
"dynamic" : "false",
"properties" : {
"displayName" : {
"type" : "keyword",
"normalizer" : "keyword_normalizer"
},
"id" : {
"type" : "keyword",
"normalizer" : "keyword_normalizer"
},
"type" : {
"type" : "keyword",
"normalizer" : "keyword_normalizer"
},
"usersByPinned" : {
"type" : "keyword"
}
}
},
"id" : {
"type" : "keyword",
"index" : false
},
"lastModifiedBy" : {
"type" : "keyword",
"index" : false
},
"lastModifiedDate" : {
"type" : "date"
},
"noteType" : {
"type" : "keyword",
"normalizer" : "keyword_normalizer"
},
"outcome" : {
"type" : "keyword",
"index" : false
},
"owner" : {
"type" : "keyword",
"copy_to" : [
"permissionToView"
]
},
"permissionToView" : {
"type" : "keyword"
},
"readOnly" : {
"type" : "boolean",
"index" : false
},
"tags" : {
"type" : "keyword",
"normalizer" : "keyword_normalizer"
},
"title" : {
"type" : "text",
"analyzer" : "text_analyzer",
"search_analyzer" : "standard"
},
"version" : {
"type" : "long",
"index" : false
},
"viewers" : {
"type" : "keyword",
"index" : false,
"copy_to" : [
"permissionToView"
]
}
}
},
"settings" : {
"index" : {
"number_of_shards" : "1",
"provided_name" : "note-management-1.0.0",
"creation_date" : "1676062153821",
"analysis" : {
"filter" : {
"ngram_filter" : {
"type" : "ngram",
"max_ngram_diff" : "10",
"min_ngram_diff" : "1"
}
},
"normalizer" : {
"keyword_normalizer" : {
"filter" : [
"lowercase"
],
"type" : "custom"
}
},
"analyzer" : {
"text_analyzer" : {
"filter" : [
"lowercase",
"ngram_filter"
],
"type" : "custom",
"tokenizer" : "standard"
}
}
},
"number_of_replicas" : "1",
"uuid" : "RGYrVMtvSFWrSF1GwxuWKw",
"version" : {
"created" : "135238227"
}
}
}
}
}
Spring Data Elasticsearch 不是针对 OpenSearch 库或服务器构建或测试的。
您可能想查看 spring-data-opensearch 项目,该项目基于 Spring Data Elasticsearch,但使用 OpenSearch 库与服务器进行通信。