2015-04-07 15 views
11

Tôi có một ứng dụng Khởi động mùa xuân với plugin Spring Data Elasticsearch trong tệp pom.xml. Tôi tạo ra một lớp tài liệu mà tôi muốn chỉ số:Dữ liệu mùa xuân Chú thích @Field của Elasticsearch không hoạt động

@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 

Tôi cũng tạo ra một kho lưu trữ cho lớp này:

public interface OperationDocumentRepository 
     extends ElasticsearchRepository<OperationDocument, Long> { 
} 

tôi đã thực hiện một bài kiểm tra đó chỉ số ba đối tượng mẫu bằng cách sử dụng kho. Nó khá dài nên tôi chỉ cần đăng nó là cần thiết. Thực tế là các bản đồ được tạo ra trong máy chủ ES bỏ qua cấu hình được thiết lập bởi các chú thích @Field:

"mappings": { 
    "operation": { 
    "properties": { 
     "operationName": { 
     "type": "string" 
     }, 
     "dateUp": { 
     "type": "long" 
     }, 
     "someTransientData": { 
     "type": "string" 
     }, 
     "sectors": { 
     "properties": { 
      "id": { 
      "type": "long" 
      }, 
      "sectorName": { 
      "type": "string" 
      } 
     } 
     } 
    } 
    } 
} 

Không có thông tin về phân tích, "someTransientData" được lưu trữ và lập chỉ mục, và dateUp được gõ như dài thay vì ngày .

Một tài liệu mẫu yêu cầu trực tiếp từ máy chủ:

{ 
    "_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" 
     } 
    ] 
    } 
} 

tôi cũng lưu ý rằng khi tôi chạy ứng dụng lần thứ hai, vào thời điểm khởi động tôi nhận được lỗi này, chỉ in khi chỉ số đã tồn tại:

lỖI 19452 --- [chính] .dersAbstractElasticsearchRepository: không thể tải elasticsearch nút: org.elasticsearch.index.mapper.MergeMappingException: Merge thất bại với thất bại {[mapper [someTransientData] có giá trị chỉ số khác nhau, mapper [someTransientData] có nhiều thứ khác nhau enize values, mapper [someTransientData] có index_analyzer khác nhau, ánh xạ đối tượng [sector] không thể thay đổi từ non-nested thành lồng nhau, mapper [operationName] có giá trị lưu trữ khác nhau, mapper [operationName] có index_analyzer khác nhau, mapper [dateUp] của loại khác, current_type [long], merged_type [date]]}

Đây có phải là lỗi của dữ liệu mùa xuân Elastic Search hoặc tôi đang làm gì đó sai?

Tôi đã thử phiên bản ổn định được cung cấp bởi khởi động mùa xuân và ảnh chụp nhanh cuối cùng của spring-data-elasticsearch. Tôi cũng đã thử máy chủ Elasticsearch được nhúng do plugin cung cấp và một phiên bản bên ngoài của phiên bản hiện tại. Tôi luôn nhận được kết quả tương tự.

Trả lời

14

Cuối cùng tôi có thể sao chép và giải quyết sự cố. Thực tế là tôi đã sử dụng ElasticTemplate để lập chỉ mục và tìm kiếm tài liệu thay vì các kho lưu trữ, bởi vì logic nghiệp vụ của tôi phức tạp hơn (sử dụng các tập hợp, v.v.).

Sau đó, tôi đã gỡ bỏ OperationDocumentRespository chưa sử dụng. Dường như kho lưu trữ là cần thiết cho việc ánh xạ kiểu đang được đăng lên máy chủ ES khi khởi động. Tôi nghĩ rằng có lớp @Document là đủ, nhưng nó không phải là.

Vì vậy, chúng tôi có hai lựa chọn ở đây:

  • Giữ OperationDocumentRepository
  • Thêm dòng này để khởi động ứng dụng:

    elasticsearchTemplate.putMapping(OperationDocument.class); 
    
1

Tôi đã cố gắng sao chép vấn đề bằng ứng dụng mẫu elasticsearch dữ liệu mùa xuân nhưng theo cấu hình của bạn, tôi nhận được kết quả mong muốn như đã đề cập ở trên.

Toàn bộ code được cam kết để dự án ở đây ->link

Nhìn vào TestCase mà tạo chỉ mục và áp dụng bản đồ khi bối cảnh lò xo ->link

Dưới đây là bản đồ được tạo ra bởi 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" : { } 
    } 
} 

bạn có thể tạo ra ví dụ tương tự với khởi động mùa xuân sử dụng https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-data-elasticsearch

và cam kết chia sẻ công khai?

+0

Tôi đã thử nghiệm ví dụ của bạn và nó làm việc. Sau đó, tôi đã tạo một dự án Khởi động mùa xuân mới và nó cũng đã hoạt động. Bây giờ tôi đang cố gắng tìm ra những gì phá vỡ ứng dụng đầu tiên của tôi. Tôi sẽ cập nhật bài viết đầu tiên nếu tôi tìm thấy nó. Cảm ơn bạn! – WinterN

+0

Tôi cuối cùng có thể nhân rộng và giải quyết vấn đề. Tôi đã đăng lý do và giải pháp trong câu trả lời khác. – WinterN

Các vấn đề liên quan