2016-05-17 21 views
7

Tôi đang sử dụng Spring Data Elasticsearch 2.0.1 với phiên bản Elastic 2.2.0.Dữ liệu mùa xuân Elasticsearch id so với _id

DAO của tôi là tương tự như:

import org.springframework.data.annotation.Id; 
import org.springframework.data.elasticsearch.annotations.Document;  

@Document(indexName = "myIndex") 
public class MyDao { 
    @Id 
    private String id; 

    public String getId() { return id; } 
    public void setId(String id) { this.id = id; } 

    <other fields, setters, getters omitted> 
} 

Tiết kiệm đối tượng để ES sử dụng một kho lưu trữ các lĩnh vực _id siêu dữ liệu được dân cư một cách chính xác. Các phương thức getter và setter cho trường id trả về chính xác giá trị của trường siêu dữ liệu _id. Nhưng trường id trong trường _source là null.

2 câu hỏi: 1) Tại sao trường id trống? 2) Có quan trọng là trường id là null?

+0

Bạn có cho phép ES tạo ID riêng của mình hay bạn đang cung cấp ID của riêng mình? tức là bạn đang gọi tất cả 'MyDao.setId (" abcdxyz ")'? – Val

+0

Tôi cho phép ES tạo ID riêng của mình. Tôi có thể sử dụng tạo ID tự động để ID hiển thị trong cả hai trường không? – wxkevin

+0

@wxkevin Một câu hỏi khác, nhưng bạn có thể chia sẻ pom của bạn không. Tôi đang mắc kẹt với lỗi trong khi cố gắng sử dụng dữ liệu mùa xuân-elasticsearch 2: [câu hỏi liên kết] (http://stackoverflow.com/questions/37047845/cannot-use-custom-autoconfiguration-with-spring-data-elasticsearch/ 37107628) –

Trả lời

9

Vì bạn cho phép ES tạo ID riêng của mình, tức là bạn không bao giờ gọi MyDao.setId("abcdxyz") thì _source không thể có giá trị trong trường id.

Điều đang xảy ra là nếu bạn tạo ID của riêng mình và gọi setId("yourid"), thì ES dữ liệu mùa xuân sẽ sử dụng nó làm giá trị cho tài liệu của bạn và cũng giữ nguyên giá trị đó vào trường _source.id. Điều này có nghĩa là _source.id sẽ không được rỗng.

Nếu bạn không gọi setId(), thì _source.id sẽ không có giá trị và ES sẽ tạo ID riêng. Khi bạn sau đó gọi getId(), Spring liệu ES sẽ chắc chắn trở lại cho bạn những giá trị của trường _id và không _source.id kể từ khi nó được chú thích với @Id

Để trả lời câu hỏi thứ hai của bạn, nó không quan trọng rằng trường _source.id là null ... miễn là bạn không cần phải tham khảo nó. Spring Data ES sẽ luôn điền nó khi ánh xạ các tài liệu JSON cho các thực thể Java của bạn, ngay cả khi trường cơ bản id trong ES là null.

+0

Vì vậy, bạn đang nói không có cách nào để có được Elasticsearch để tạo ID và sử dụng ID đó trong trường id của tôi? – wxkevin

+1

Có, ES ID được lưu trữ trong trường '_id' khác với' _source.id' (hoặc bất kỳ tên nào bạn muốn cung cấp cho trường đó). Cách tiếp cận tốt nhất là tạo ID của riêng bạn và gọi 'setId()' – Val

+1

Tôi đã sử dụng @JsonIgnore trong thuộc tính id và trường này không được tạo trong ES! – Wendel

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