web-dev-qa-db-ja.com

Spring Data Elasticsearchの@Fieldアノテーションが機能しない

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 --- [メイン] .dersAbstractElasticsearchRepository:elasticsearchノードのロードに失敗しました:org.elasticsearch.index.mapper.MergeMappingException:マージが失敗して失敗しました{[mapper [someTransientData]には異なるインデックス値があり、mapper [someTransientData]には異なるトークン化があります値、マッパー[someTransientData]には異なるindex_analyzerがあり、オブジェクトマッピング[セクター]は非ネストからネストに変更できません。マッパー[operationName]には異なるストア値があり、マッパー[operationName]には異なるindex_analyzer、マッパー[dateUp]がありますtype、current_type [long]、merged_type [date]]}

これはSpring Data Elastic Searchのバグですか、それとも何か間違っていますか?

春のブートによって提供される安定版と、春のデータ弾性検索の最後のスナップショットを試しました。また、プラグインによって提供される組み込みのElasticsearchサーバーと、現在のバージョンの外部サーバーも試しました。私はいつも同じ結果を得ました。

13
Javier Alvarez

ようやく問題を再現して解決できました。実際のところ、ビジネスロジックが複雑になった(集約の使用など)ため、リポジトリの代わりにドキュメントのインデックス作成と検索にElasticTemplateを使用していました。

その後、未使用のOperationDocumentRespositoryを削除しました。起動時にESサーバーにポストされる型マッピングにはリポジトリが必要なようです。 @Documentクラスがあれば十分だと思いましたが、それだけでは不十分です。

したがって、ここには2つのオプションがあります。

  • OperationDocumentRepositoryを保持する
  • 次の行をアプリのスタートアップに追加します。

    elasticsearchTemplate.putMapping(OperationDocument.class);
    
16
Javier Alvarez

Spring Data Elasticsearchサンプルアプリケーションを使用して問題を再現しようとしましたが、構成に応じて、上記のように望ましい結果が得られます。

コード全体がここでプロジェクトにコミットされます-> link

春のコンテキストが読み込まれたときにインデックスを生成してマッピングを適用するTestCaseを見てください-> link

TestCaseによって生成されたマッピングは次のとおりです。

  {
  "operations" : {
    "aliases" : { },
    "mappings" : {
      "operation" : {
        "properties" : {
          "dateUp" : {
            "type" : "date",
            "store" : true,
            "format" : "dd.MM.yyyy hh:mm"
          },
          "operationName" : {
            "type" : "string",
            "store" : true,
            "analyzer" : "standard"
          },
          "sectors" : {
            "type" : "nested"
          },
          "someTransientData" : {
            "type" : "string",
            "index" : "not_analyzed"
          }
        }
      }
    },
    "settings" : {
      "index" : {
        "refresh_interval" : "1s",
        "number_of_shards" : "5",
        "store" : {
          "type" : "fs"
        },
        "creation_date" : "1428677234773",
        "number_of_replicas" : "1",
        "version" : {
          "created" : "1040499"
        },
        "uuid" : "-djzLu-IQ0CBs-M6R0-R6Q"
      }
    },
    "warmers" : { }
  }
}

https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-data-elasticsearch を使用して、Spring Bootで同様の例を作成できますか? =

パブリックシェアにコミット?

2
Mohsin Husen