Tìm kiếm linh hoạt, nhiều chỉ mục so với một chỉ mục và loại cho các tập dữ liệu khác nhau?


161

Tôi có một ứng dụng được phát triển bằng cách sử dụng mẫu MVC và tôi muốn lập chỉ mục nhiều mô hình của nó, điều này có nghĩa là mỗi mô hình có cấu trúc dữ liệu khác nhau.

  • Là tốt hơn để sử dụng các chỉ mục mutlipl, một cho mỗi mô hình hoặc có một loại trong cùng một chỉ mục cho mỗi mô hình? Cả hai cách cũng sẽ yêu cầu một truy vấn tìm kiếm khác nhau tôi nghĩ. Tôi chỉ bắt đầu về điều này.

  • Có sự khác biệt về hiệu năng giữa cả hai khái niệm nếu tập dữ liệu nhỏ hay lớn không?

Tôi sẽ tự kiểm tra câu hỏi thứ 2 nếu ai đó có thể giới thiệu cho tôi một số dữ liệu mẫu tốt cho mục đích đó.

Câu trả lời:


184

Có những ý nghĩa khác nhau cho cả hai phương pháp.

Giả sử bạn đang sử dụng cài đặt mặc định của Elaticsearch, có 1 chỉ mục cho mỗi mô hình sẽ tăng đáng kể số lượng phân đoạn của bạn vì 1 chỉ mục sẽ sử dụng 5 phân đoạn, 5 mô hình dữ liệu sẽ sử dụng 25 phân đoạn; trong khi có 5 loại đối tượng trong 1 chỉ mục vẫn sẽ sử dụng 5 phân đoạn.

Ý nghĩa của việc có từng mô hình dữ liệu là chỉ mục:

  • Hiệu quả và nhanh chóng để tìm kiếm trong chỉ mục, vì lượng dữ liệu nên nhỏ hơn trong mỗi phân đoạn vì nó được phân phối cho các chỉ số khác nhau.
  • Tìm kiếm sự kết hợp của các mô hình dữ liệu từ 2 chỉ mục trở lên sẽ tạo ra chi phí, bởi vì truy vấn sẽ phải được gửi đến nhiều phân đoạn hơn trên các chỉ mục, được biên dịch và gửi lại cho người dùng.
  • Không được đề xuất nếu tập dữ liệu của bạn nhỏ vì bạn sẽ phải chịu thêm dung lượng với mỗi phân đoạn bổ sung được tạo và mức tăng hiệu suất là không đáng kể.
  • Được khuyến nghị nếu bộ dữ liệu của bạn lớn và các truy vấn của bạn mất nhiều thời gian để xử lý, vì các phân đoạn chuyên dụng đang lưu trữ dữ liệu cụ thể của bạn và việc Elaticsearch sẽ dễ dàng xử lý hơn.

Hàm ý cho việc mỗi mô hình dữ liệu là một loại đối tượng trong một chỉ mục:

  • Nhiều dữ liệu sẽ được lưu trữ trong 5 phân đoạn của một chỉ mục, điều đó có nghĩa là có ít vấn đề hơn khi bạn truy vấn trên các mô hình dữ liệu khác nhau nhưng kích thước phân đoạn của bạn sẽ lớn hơn đáng kể.
  • Nhiều dữ liệu trong các phân đoạn sẽ mất nhiều thời gian hơn cho Elaticsearch để tìm kiếm thông qua vì có nhiều tài liệu để lọc hơn.
  • Không được đề xuất nếu bạn biết bạn đang trải qua 1 terabyte dữ liệu và bạn không phân phối dữ liệu của mình qua các chỉ số khác nhau hoặc nhiều phân đoạn trong ánh xạ Elaticsearch của bạn.
  • Được khuyến nghị cho các tập dữ liệu nhỏ, vì bạn sẽ không lãng phí dung lượng lưu trữ để tăng hiệu suất cận biên vì mỗi phân đoạn chiếm không gian trong phần cứng của bạn.

Nếu bạn đang hỏi quá nhiều dữ liệu so với dữ liệu nhỏ là gì? Thông thường, nó phụ thuộc vào tốc độ bộ xử lý và RAM của phần cứng của bạn, lượng dữ liệu bạn lưu trữ trong mỗi biến trong ánh xạ của bạn cho Elaticsearch và các yêu cầu truy vấn của bạn; sử dụng nhiều khía cạnh trong các truy vấn của bạn sẽ làm chậm đáng kể thời gian phản hồi của bạn. Không có câu trả lời đơn giản cho vấn đề này và bạn sẽ phải điểm chuẩn theo nhu cầu của bạn.


8
Câu trả lời này không phải là hoàn toàn không có các thông tin từ elasticsearch.org/guide/en/elasticsearch/guide/current/...
AndreKR

5
Để thêm vào câu trả lời xuất sắc, tôi trích dẫn từ tài liệu ES 5.2 giải thích tại sao việc duy trì số lượng lớn các mảnh vỡ không được khuyến nghị: " By default elasticsearch rejects search requests that would query more than 1000 shards. The reason is that such large numbers of shards make the job of the coordinating node very CPU and memory intensive. It is usually a better idea to organize data in such a way that there are fewer larger shards. In case you would like to bypass this limit, which is discouraged, you can update the action.search.shard_count.limit cluster setting to a greater value."
lãng quên

49

Mặc dù câu trả lời của Jonathan là đúng vào thời điểm đó, thế giới đã chuyển sang và bây giờ có vẻ như những người đứng sau ElasticSearch có kế hoạch dài hạn để bỏ hỗ trợ cho nhiều loại:

Nơi chúng tôi muốn đến: Chúng tôi muốn xóa khái niệm về các loại khỏi Elaticsearch, trong khi vẫn hỗ trợ phụ huynh / trẻ em.

Vì vậy, đối với các dự án mới, chỉ sử dụng một loại duy nhất cho mỗi chỉ mục sẽ giúp việc nâng cấp cuối cùng lên ElasticSearch 6.x trở nên dễ dàng hơn.


13

Câu trả lời của Jonathan rất hay. Tôi chỉ cần thêm một vài điểm khác để xem xét:

  • số lượng phân đoạn có thể được tùy chỉnh cho mỗi giải pháp bạn chọn. Bạn có thể có một chỉ mục với 15 phân đoạn chính hoặc chia thành 3 chỉ mục cho 5 phân đoạn - phối cảnh hiệu suất sẽ không thay đổi (giả sử dữ liệu được phân phối đều)
  • suy nghĩ về việc sử dụng dữ liệu. I E. nếu bạn sử dụng kibana để trực quan hóa, việc bao gồm / loại trừ chỉ mục cụ thể sẽ dễ dàng hơn, nhưng các loại phải được lọc trong bảng điều khiển
  • lưu giữ dữ liệu: đối với dữ liệu nhật ký / số liệu ứng dụng, hãy sử dụng các chỉ mục khác nhau nếu bạn yêu cầu thời gian lưu khác nhau

Thời gian lưu giữ có nghĩa là gì? Bạn đang đề cập đến thời gian để sống trường? Điều đó được thiết lập trên cơ sở mỗi tài liệu.
Kshitiz Sharma

Không, ở đây thời gian lưu giữ có nghĩa là lưu giữ tài liệu / chỉ mục - thời gian lưu trữ những dữ liệu đó. Dựa trên chất lượng dữ liệu, kích thước, tầm quan trọng - Tôi sử dụng để chỉ định chính sách lưu giữ khác nhau. Một số dữ liệu / chỉ mục bị xóa sau 7 ngày, số khác sau 6w và một số sau 10 năm ...
Marcel Matus

2

Cả hai câu trả lời trên đều tuyệt vời!

Tôi đang thêm một ví dụ về một số loại trong một chỉ mục. Giả sử bạn đang phát triển một ứng dụng để tìm kiếm sách trong thư viện. Có một vài câu hỏi để hỏi chủ sở hữu Thư viện,

Câu hỏi:

  1. Có bao nhiêu cuốn sách bạn dự định lưu trữ?

  2. Những loại sách bạn sẽ lưu trữ trong thư viện?

  3. Làm thế nào bạn sẽ tìm kiếm các cuốn sách?

Đáp án:

  1. Tôi đang dự định lưu trữ 50 k - đến 70 k sách (khoảng)

  2. Tôi sẽ có 15 cuốn sách liên quan đến công nghệ 15 k -20 (khoa học máy tính, cơ khí, kỹ thuật hóa học, v.v.), 15 k sách lịch sử, 10 k sách khoa học y tế. 10 k sách liên quan đến ngôn ngữ (tiếng Anh, tiếng Tây Ban Nha, v.v.)

  3. Tìm kiếm theo tên tác giả, tên tác giả, năm xuất bản, tên của nhà xuất bản. (Điều này cung cấp cho bạn ý tưởng về thông tin bạn nên lưu trữ trong chỉ mục)

Từ các câu trả lời ở trên, chúng ta có thể nói lược đồ trong chỉ mục của chúng ta sẽ trông giống như thế này.

// Đây không phải là ánh xạ chính xác, chỉ cho ví dụ

            "yearOfPublish":{
                "type": "integer"
            },
            "author":{
                "type": "object",
                "properties": {
                    "firstName":{
                        "type": "string"
                    },
                    "lastName":{
                        "type": "string"
                    }
                }
            },
            "publisherName":{
                "type": "string"
            }
        }

Để đạt được những điều trên, chúng ta có thể tạo một chỉ mục gọi là Sách và có thể có nhiều loại khác nhau.

Mục lục: Sách

Các loại: Khoa học, Nghệ thuật

(Hoặc bạn có thể tạo nhiều loại như Công nghệ, Khoa học Y tế, Lịch sử, Ngôn ngữ, nếu bạn có nhiều sách hơn)

Điều quan trọng cần lưu ý ở đây là lược đồ tương tự nhưng dữ liệu không giống nhau. Và điều quan trọng khác là tổng dữ liệu bạn đang lưu trữ.

Hy vọng những điều trên sẽ giúp khi nào có các loại khác nhau trong một Chỉ mục, nếu bạn có lược đồ khác, bạn nên xem xét các chỉ mục khác nhau. Chỉ số nhỏ cho dữ liệu ít hơn. chỉ số lớn cho dữ liệu lớn :-)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.