2013-06-14 42 views
53

Tôi thực sự không hiểu tại sao trong core types link nó nói trong bản mô tả các thuộc tính (đối với một số, ví dụ):Tại sao tôi cần "lưu trữ": "có" trong elasticsearch?

  1. cửa hàng - Thiết lập là yes để lưu trữ lĩnh vực thực tế trong chỉ mục, không để không lưu trữ nó . Mặc định là không (lưu ý, bản thân tài liệu JSON được lưu trữ và nó có thể được lấy từ nó)
  2. chỉ mục - Đặt thành không nếu giá trị không được lập chỉ mục. Trong trường hợp này, lưu trữ nên được đặt thành có, vì nếu nó không được lập chỉ mục và không được lưu trữ, có gì để làm với nó

Hai phần đậm dường như mâu thuẫn. Nếu "index":"no", "store":"no" Tôi vẫn có thể nhận được giá trị từ nguồn. Điều này có thể là một sử dụng tốt nếu tôi có một trường có chứa một URL ví dụ. Không?

Tôi đã có một thử nghiệm nhỏ, trong đó tôi có hai ánh xạ, trong một trường được đặt thành "store":"yes" và mặt khác là "store":"no".

Trong cả hai trường hợp tôi vẫn có thể chỉ định trong truy vấn của tôi:

{"query":{"match_all":{}}, "fields":["my_test_field"]} 

và tôi đã nhận được câu trả lời tương tự, trở về lĩnh vực này.

Tôi nghĩ rằng nếu "store" được đặt thành "no" điều đó có nghĩa là tôi không thể truy xuất trường cụ thể, nhưng phải lấy toàn bộ số _source và phân tích cú pháp đó ở phía máy khách.

Vì vậy, lợi ích nào có trong cài đặt "store" đến "yes"? Chỉ có liên quan nếu tôi loại trừ trường khỏi trường "_source" một cách rõ ràng?

Trả lời

99

Tôi nghĩ rằng nếu "cửa hàng" được thiết lập để "không" nó sẽ có nghĩa là tôi không thể lấy lĩnh vực cụ thể, nhưng đã phải nhận được toàn bộ _source và phân tích nó trên các mặt hàng.

Đó chính xác là những gì elasticsearch làm cho bạn khi một trường không được lưu trữ (mặc định) và trường _source được bật (mặc định).

Bạn thường gửi trường đến elasticsearch vì bạn muốn tìm kiếm trên đó hoặc truy xuất nó. Nhưng đúng là nếu bạn không lưu trữ trường một cách rõ ràng và bạn không vô hiệu hóa nguồn, bạn vẫn có thể truy xuất trường bằng cách sử dụng _source. Điều này có nghĩa là trong một số trường hợp, nó có thể thực sự có ý nghĩa để có một trường không được lập chỉ mục hoặc lưu trữ.

Khi bạn lưu trữ một trường, điều đó được thực hiện trong lucene cơ bản. Lucene là một chỉ số đảo ngược, cho phép tìm kiếm toàn văn nhanh và cung cấp các id tài liệu được cung cấp cho các truy vấn văn bản. Ngoài chỉ số đảo ngược Lucene có một số loại lưu trữ, nơi các giá trị trường có thể được lưu trữ để được lấy ra cho một id tài liệu. Bạn thường lưu trữ trong lucene các lĩnh vực mà bạn muốn quay trở lại như kết quả tìm kiếm. Elasticsearch không yêu cầu lưu trữ mọi trường mà bạn muốn trả lại vì nó luôn luôn lưu trữ theo mặc định mọi tài liệu mà bạn gửi cho nó, do đó, nó luôn có thể trả lại mọi thứ bạn gửi cho nó dưới dạng kết quả tìm kiếm.

Chỉ trong một vài trường hợp, có thể hữu ích khi lưu trữ trường một cách rõ ràng: khi trường _source bị tắt hoặc khi chúng tôi muốn tránh phân tích cú pháp, ngay cả khi việc phân tích cú pháp được thực hiện tự động bởi elasticsearch. Hãy nhớ rằng việc truy xuất nhiều trường được lưu trữ từ lucene có thể yêu cầu một đĩa tìm kiếm trên mỗi trường trong khi chỉ truy xuất số _source từ lucene và phân tích cú pháp để lấy các trường cần thiết chỉ là một đĩa tìm kiếm và nhanh hơn trong hầu hết các trường hợp.

+1

Thật tuyệt vời! Cảm ơn lời giải thích. – eran

+1

"Hãy nhớ rằng việc truy xuất nhiều trường được lưu trữ từ lucene có thể yêu cầu một đĩa tìm kiếm trên mỗi trường trong khi chỉ truy xuất _source từ lucene và phân tích cú pháp để truy xuất các trường cần thiết chỉ là một đĩa tìm kiếm và nhanh hơn trong hầu hết các trường hợp. " Cho SSD được sử dụng để lưu trữ chỉ mục, có ảnh hưởng đến việc giảm số lượng người tìm kiếm đáng chú ý không? "Trong ổ cứng, điều này thường là từ 0,2 đến 0,8 ms. SSD điển hình sẽ có thời gian tìm kiếm từ 0,08 đến 0,16 ms". –

+4

Cũng hữu ích khi lưu trữ rõ ràng các trường không được trả lại trong _source. Dấu thời gian là một ví dụ. Ngay cả khi bạn đã bật chúng trên một loại, bạn sẽ không thể truy xuất chúng ("trường": ["_timestamp"] sẽ không trả lại gì trừ khi bạn có "_timestamp": {"store": true} trong ánh xạ của bạn cho loại đó. – csjacobs24

2

Theo mặc định trong elasticsearch, _source (tài liệu được lập chỉ mục) được lưu trữ. Điều này có nghĩa là khi bạn tìm kiếm, bạn có thể lấy lại nguồn tài liệu thực tế. Hơn nữa, elasticsearch sẽ tự động trích xuất các trường/đối tượng từ _source và trả về chúng nếu bạn yêu cầu một cách rõ ràng (cũng như có thể sử dụng nó trong các thành phần khác, như làm nổi bật).

Bạn có thể chỉ định rằng một trường cụ thể cũng được lưu trữ. Điều này có nghĩa là dữ liệu cho trường đó sẽ được lưu trữ "trên chính nó". Có nghĩa là nếu bạn yêu cầu "field1" (được lưu trữ), elasticsearch sẽ xác định rằng nó được lưu trữ và tải nó từ chỉ mục thay vì lấy nó từ _source (giả sử _source được kích hoạt).

Khi nào bạn muốn bật lưu trữ các trường cụ thể? Hầu hết thời gian, bạn không. Tìm nạp _source nhanh và giải nén nhanh chóng. Nếu bạn có tài liệu rất lớn, trong đó chi phí lưu trữ _source hoặc chi phí phân tích cú pháp _source cao, bạn có thể ánh xạ rõ ràng một số trường sẽ được lưu trữ thay thế.

Lưu ý, có phí truy xuất từng trường được lưu trữ. Vì vậy, ví dụ, nếu bạn có một json với 10 trường với kích thước hợp lý, và bạn ánh xạ tất cả chúng như được lưu trữ, và yêu cầu tất cả chúng, điều này có nghĩa là tải từng cái (tìm kiếm nhiều đĩa hơn), so với chỉ tải _source (đó là một trường, có thể được nén).

Tôi nhận được câu trả lời này ở bên dưới liên kết được trả lời bởi shay.banon bạn có thể đọc toàn bộ chuỗi này để hiểu rõ về nó. enter link description here

+0

Vui lòng không sao chép cùng một câu trả lời cho nhiều câu hỏi (http://stackoverflow.com/a/38787655/466738, http://stackoverflow.com/a/38787619/466738).Nếu bạn cho rằng các câu hỏi có liên quan đến cùng một điều, hãy gắn cờ các câu hỏi đó dưới dạng trùng lặp (http://stackoverflow.com/help/duplicates) –

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