pom.xml に Spring Data Elasticsearch プラグインを使用した Spring Boot アプリケーションがあります。インデックスを作成したいドキュメント クラスを作成しました。
@Document(indexName = "operations", type = "operation")
public class OperationDocument {
@Id
private Long id;
@Field(
type = FieldType.String,
index = FieldIndex.analyzed,
searchAnalyzer = "standard",
indexAnalyzer = "standard",
store = true
)
private String operationName;
@Field(
type = FieldType.Date,
index = FieldIndex.not_analyzed,
store = true,
format = DateFormat.custom, pattern = "dd.MM.yyyy hh:mm"
)
private Date dateUp;
@Field(
type = FieldType.String,
index = FieldIndex.not_analyzed,
store = false
)
private String someTransientData;
@Field(type = FieldType.Nested)
private List<Sector> sectors;
//Getter and setters
このクラスのリポジトリも作成しました。
public interface OperationDocumentRepository
extends ElasticsearchRepository<OperationDocument, Long> {
}
リポジトリを使用して 3 つのサンプル オブジェクトにインデックスを付けるテストを行いました。かなり長いので、必要なだけ投稿します。実際には、ES サーバーで作成されたマッピングは、@Field アノテーションによって設定された構成を無視します。
"mappings": {
"operation": {
"properties": {
"operationName": {
"type": "string"
},
"dateUp": {
"type": "long"
},
"someTransientData": {
"type": "string"
},
"sectors": {
"properties": {
"id": {
"type": "long"
},
"sectorName": {
"type": "string"
}
}
}
}
}
}
アナライザーに関する情報はありません。「someTransientData」が格納されてインデックスが作成され、dateUp は Date ではなく Long として型指定されます。
サーバーから直接要求されたサンプル ドキュメント:
{
"_index": "operations",
"_type": "operation",
"_id": "AUyUk2cY3nXeOFxdOlQW",
"_version": 1,
"_score": 1,
"_source": {
"id": null,
"operationName": "Second Operation Name",
"dateUp": 1428421827091,
"someTransientData": "Do not index or store",
"sectors": [
{
"id": 2,
"sectorName": "Health Care"
},
{
"id": 3,
"sectorName": "Construction"
}
]
}
}
また、アプリケーションを 2 回目に実行すると、起動時にこのエラーが発生し、インデックスが既に存在する場合にのみ出力されることにも気付きました。
エラー 19452 --- [main] .dersAbstractElasticsearchRepository: Elasticsearch ノードの読み込みに失敗しました: org.elasticsearch.index.mapper.MergeMappingException: マージが失敗して失敗しました {[mapper [someTransientData] には異なるインデックス値があり、mapper [someTransientData] には異なるトークン化値があります、マッパー [someTransientData] には異なる index_analyzer があります。オブジェクト マッピング [セクター] はネストされていないものからネストされたものに変更できません。マッパー [operationName] には異なるストア値があります。マッパー [operationName] には異なる index_analyzer があります。マッパー [dateUp] のタイプは異なります。 、current_type [ロング]、merged_type [日付]]}
これは Spring Data Elastic Search のバグですか、それとも何か間違っていますか?
spring boot が提供する安定版と spring-data-elasticsearch の最後のスナップショットを試しました。また、プラグインによって提供される組み込み Elasticsearch サーバーと、現在のバージョンの外部サーバーも試しました。私はいつも同じ結果を得ました。