paint-brush
Lập mô hình dữ liệu trong Elaticsearch: Sử dụng truy vấn lồng nhau và mối quan hệ cha-contừ tác giả@rocksetcloud
7,713 lượt đọc
7,713 lượt đọc

Lập mô hình dữ liệu trong Elaticsearch: Sử dụng truy vấn lồng nhau và mối quan hệ cha-con

từ tác giả Rockset10m2024/04/17
Read on Terminal Reader

dài quá đọc không nổi

Quản lý các mối quan hệ trong Elaticsearch có thể là một thách thức, nhưng chúng tôi có các truy vấn lồng nhau và mối quan hệ cha-con để giải quyết vấn đề đó, v.v.
featured image - Lập mô hình dữ liệu trong Elaticsearch: Sử dụng truy vấn lồng nhau và mối quan hệ cha-con
Rockset HackerNoon profile picture
0-item
1-item



Mô hình hóa dữ liệu trong Elaticsearch không rõ ràng như khi xử lý cơ sở dữ liệu quan hệ. Không giống như các cơ sở dữ liệu quan hệ truyền thống dựa vào việc chuẩn hóa dữ liệu và các phép nối SQL, Elaticsearch yêu cầu các phương pháp thay thế để quản lý các mối quan hệ.


Có bốn cách giải quyết phổ biến để quản lý mối quan hệ trong Elaticsearch:


  • Tham gia phía ứng dụng

  • Không chuẩn hóa dữ liệu

  • Các loại trường lồng nhau và truy vấn lồng nhau

  • Mối quan hệ cha mẹ và con cái


Trong blog này, chúng ta sẽ thảo luận cách bạn có thể thiết kế mô hình dữ liệu của mình để xử lý các mối quan hệ bằng cách sử dụng loại trường lồng nhau và mối quan hệ cha-con. Chúng tôi sẽ đề cập đến kiến trúc, ý nghĩa về hiệu suất và các trường hợp sử dụng của hai kỹ thuật này.

Các loại trường lồng nhau và truy vấn lồng nhau

Elaticsearch hỗ trợ các cấu trúc lồng nhau, trong đó các đối tượng có thể chứa các đối tượng khác. Các loại trường lồng nhau là các đối tượng JSON trong tài liệu chính, có thể có các trường và loại riêng biệt. Các đối tượng lồng nhau này được coi là các tài liệu ẩn, riêng biệt và chỉ có thể truy cập được bằng truy vấn lồng nhau.


Các loại trường lồng nhau rất phù hợp cho các mối quan hệ trong đó tính toàn vẹn dữ liệu, sự liên kết chặt chẽ và cấu trúc phân cấp là quan trọng. Chúng bao gồm các mối quan hệ một-một và một-nhiều trong đó có một thực thể chính. Ví dụ: đại diện cho một người và nhiều địa chỉ cũng như số điện thoại của họ trong một tài liệu.


Với các loại trường lồng nhau, Elaticsearch lưu trữ toàn bộ tài liệu, cũng như các đối tượng cha và các đối tượng lồng nhau, trên một khối và phân đoạn Lucene duy nhất. Điều này có thể dẫn đến tốc độ truy vấn nhanh hơn khi mối quan hệ được chứa trong một tài liệu.


Ví dụ về Loại trường lồng nhau và Truy vấn lồng nhau

Hãy xem một ví dụ về một bài viết blog có bình luận. Chúng tôi muốn lồng các nhận xét bên dưới bài đăng blog để có thể dễ dàng truy vấn chúng cùng nhau trong cùng một tài liệu.


GITHUB JULIE-MILLS

 { "post_id": "1", "title": "Introduction to Elasticsearch Data Modeling", "content": "Exploring various data modeling options in Elasticsearch.", "comments": [ { "comment_id": "101", "text": "Great overview of data modeling!" }, { "comment_id": "102", "text": "Looking forward to more content." } ] }


Lợi ích của các loại trường lồng nhau và truy vấn lồng nhau

Lợi ích của các mối quan hệ đối tượng lồng nhau bao gồm:


  • Dữ liệu được lưu trữ trong cùng một khối và phân đoạn Lucene: Việc lưu trữ các đối tượng lồng nhau trong cùng một khối và phân đoạn Lucene dẫn đến truy vấn nhanh hơn vì dữ liệu được sắp xếp theo thứ tự.
  • Tính toàn vẹn dữ liệu: Vì các mối quan hệ được duy trì trong cùng một tài liệu nên nó có thể đảm bảo tính chính xác trong các truy vấn lồng nhau.
  • Mô hình dữ liệu tài liệu: Dễ dàng dành cho các nhà phát triển đã quen với mô hình dữ liệu NoSQL nơi bạn đang truy vấn các tài liệu và dữ liệu lồng nhau trong đó.

Hạn chế của các loại trường lồng nhau và truy vấn lồng nhau

  • Cập nhật không hiệu quả : Việc cập nhật, chèn và xóa trên bất kỳ phần nào của tài liệu có các đối tượng lồng nhau yêu cầu lập chỉ mục lại toàn bộ tài liệu, việc này có thể tốn nhiều bộ nhớ, đặc biệt nếu tài liệu lớn hoặc cập nhật thường xuyên.


  • Hiệu suất truy vấn với các trường lồng nhau lớn : Nếu bạn có tài liệu có các trường lồng nhau đặc biệt lớn thì điều này có thể ảnh hưởng đến hiệu suất. Điều này là do yêu cầu tìm kiếm lấy toàn bộ tài liệu.


  • Nhiều cấp độ lồng nhau có thể trở nên phức tạp : Việc chạy các truy vấn trên các cấu trúc lồng nhau có nhiều cấp độ vẫn có thể trở nên phức tạp. Đó là vì các truy vấn có thể liên quan đến các truy vấn lồng nhau trong các truy vấn lồng nhau, dẫn đến mã khó đọc hơn.

Mối quan hệ cha mẹ và con cái

Trong ánh xạ cha-con, tài liệu được tổ chức thành kiểu cha và con. Mỗi tài liệu con có một liên kết trực tiếp với tài liệu gốc. Mối quan hệ này được thiết lập thông qua một giá trị trường cụ thể trong tài liệu con khớp với ID của tài liệu gốc. Mô hình cha-con áp dụng cách tiếp cận phi tập trung trong đó tài liệu cha và con tồn tại độc lập.


Các phép nối cha-con phù hợp với mối quan hệ một-nhiều hoặc nhiều-nhiều giữa các thực thể. Hãy tưởng tượng một ứng dụng mà bạn muốn tạo mối quan hệ giữa các công ty và địa chỉ liên hệ, đồng thời muốn tìm kiếm các công ty và địa chỉ liên hệ cũng như địa chỉ liên hệ tại các công ty cụ thể.


Elaticsearch làm cho các kết nối cha-con hoạt động hiệu quả bằng cách theo dõi xem cha mẹ được kết nối với con nào và có cả hai thực thể nằm trên cùng một phân đoạn. Bằng cách bản địa hóa hoạt động kết hợp, Elaticsearch tránh được nhu cầu liên lạc rộng rãi giữa các phân đoạn, điều này có thể gây tắc nghẽn hiệu suất.

Ví dụ về mối quan hệ cha mẹ và con cái

Hãy lấy ví dụ về mối quan hệ cha-con đối với các bài đăng và bình luận trên blog. Mỗi bài đăng trên blog, tức là phụ huynh, có thể có một số nhận xét, tức là trẻ em. Để tạo mối quan hệ cha-con, hãy lập chỉ mục dữ liệu như sau:


 PUT my-index-000001 { "mappings": { "properties": { "post_id": { "type": "keyword" }, "post_id": { "type": "join", "relations": { "post": "comment" } } } } }


Tài liệu gốc sẽ là một bài đăng trông như thế này:


 { "post_id": "1", "title": "Introduction to Elasticsearch Data Modeling", "content": "Exploring various data modeling options in Elasticsearch." }


Tài liệu con khi đó sẽ là một nhận xét chứa post_id liên kết nó với tài liệu gốc của nó.


 { "comment_id": "101", "text": "Great overview of data modeling!", "post_id": "1" }


Lợi ích của mối quan hệ cha mẹ và con cái

Những lợi ích của việc làm mẫu giữa cha mẹ và con cái bao gồm:


  • Tương tự mô hình dữ liệu quan hệ : Trong mối quan hệ cha-con, tài liệu cha và con riêng biệt và được liên kết bằng một ID cha duy nhất. Thiết lập này gần với mô hình cơ sở dữ liệu quan hệ hơn và có thể trực quan hơn đối với những người quen thuộc với các khái niệm như vậy.


  • Hiệu quả cập nhật : Tài liệu con có thể được thêm, sửa đổi hoặc xóa mà không ảnh hưởng đến tài liệu gốc hoặc các tài liệu con khác. Điều này đặc biệt có lợi khi xử lý một số lượng lớn tài liệu con yêu cầu cập nhật thường xuyên. Lưu ý rằng việc liên kết tài liệu con với tài liệu gốc khác là một quá trình phức tạp hơn vì tài liệu gốc mới có thể nằm trên một phân đoạn khác.


  • Phù hợp hơn cho trẻ em không đồng nhất : Vì tài liệu con được lưu trữ riêng biệt nên chúng có thể có nhiều bộ nhớ và hiệu quả lưu trữ hơn, đặc biệt trong trường hợp có nhiều tài liệu con có sự khác biệt đáng kể về kích thước.

Những hạn chế của mối quan hệ cha mẹ và con cái

Những hạn chế của mối quan hệ cha mẹ và con cái bao gồm:


  • Truy vấn tốn kém, chậm : Việc kết hợp các tài liệu trên các chỉ mục riêng biệt sẽ bổ sung thêm công việc tính toán trong quá trình thực hiện truy vấn, một lần nữa ảnh hưởng đến hiệu suất. Elaticsearch lưu ý rằng các truy vấn cha-con có thể chậm hơn 5-10 lần so với truy vấn các đối tượng lồng nhau.


  • Chi phí ánh xạ : Mối quan hệ cha-con có thể tiêu tốn nhiều tài nguyên bộ nhớ và bộ đệm hơn. Elaticsearch duy trì một bản đồ về các mối quan hệ cha-con, bản đồ này có thể phát triển lớn và tiêu tốn bộ nhớ đáng kể, đặc biệt là với khối lượng tài liệu lớn.


  • Quản lý kích thước phân đoạn : Vì cả tài liệu gốc và tài liệu con đều nằm trên cùng một phân đoạn nên có nguy cơ tiềm ẩn về việc phân phối dữ liệu không đồng đều trên toàn cụm. Một số phân đoạn có thể lớn hơn đáng kể so với những phân đoạn khác, đặc biệt nếu có tài liệu gốc có nhiều tài liệu con. Điều này có thể dẫn đến những thách thức trong việc quản lý và mở rộng quy mô cụm Elaticsearch .


  • Lập chỉ mục lại và bảo trì cụm : Nếu bạn cần lập chỉ mục lại dữ liệu hoặc thay đổi chiến lược phân chia , mối quan hệ cha-con có thể làm phức tạp quá trình này. Bạn sẽ cần đảm bảo rằng tính toàn vẹn của mối quan hệ được duy trì trong các hoạt động như vậy. Các tác vụ bảo trì cụm định kỳ, chẳng hạn như cân bằng lại phân đoạn hoặc nâng cấp nút, có thể trở nên phức tạp hơn. Phải đặc biệt chú ý để đảm bảo rằng mối quan hệ cha mẹ và con cái không bị gián đoạn trong quá trình này.


Elastic , công ty đứng sau Elaticsearch, sẽ luôn khuyến nghị bạn nên thực hiện các phép nối phía ứng dụng, chuẩn hóa dữ liệu và/hoặc các đối tượng lồng nhau trước khi đi vào mối quan hệ cha-con.

So sánh tính năng của các truy vấn lồng nhau và mối quan hệ cha-con

Bảng bên dưới cung cấp thông tin tóm tắt về đặc điểm của các loại trường lồng nhau và truy vấn cũng như mối quan hệ cha-con để so sánh các phương pháp lập mô hình dữ liệu song song.



Các loại trường lồng nhau và truy vấn lồng nhau

Mối quan hệ cha mẹ và con cái

Sự định nghĩa

Lồng một đối tượng vào trong một đối tượng khác

Liên kết các tài liệu cha và con với nhau

Các mối quan hệ

Một đối một, một đối nhiều

Một-nhiều, nhiều-nhiều

Tốc độ truy vấn

Nói chung nhanh hơn mối quan hệ cha-con vì dữ liệu được lưu trữ trong cùng một khối và phân đoạn

Nói chung chậm hơn 5-10 lần so với các đối tượng lồng nhau vì tài liệu cha và con được nối vào thời điểm truy vấn.

Truy vấn linh hoạt

Kém linh hoạt hơn so với các truy vấn cha-con vì nó giới hạn phạm vi truy vấn trong giới hạn của từng đối tượng lồng nhau

Mang lại sự linh hoạt hơn trong việc truy vấn vì tài liệu gốc hoặc tài liệu con có thể được truy vấn cùng nhau hoặc riêng biệt

Cập nhật dữ liệu

Cập nhật các đối tượng lồng nhau yêu cầu lập chỉ mục lại toàn bộ tài liệu

Cập nhật tài liệu con dễ dàng hơn vì không yêu cầu lập chỉ mục lại tất cả tài liệu

Sự quản lý

Quản lý đơn giản hơn vì mọi thứ đều được chứa trong một tài liệu duy nhất

Quản lý phức tạp hơn do lập chỉ mục và duy trì mối quan hệ riêng biệt giữa tài liệu cha và con

Trường hợp sử dụng

Lưu trữ và truy vấn dữ liệu phức tạp với nhiều cấp độ phân cấp

Mối quan hệ ít bố mẹ nhiều con thích sản phẩm và đánh giá sản phẩm


Các lựa chọn thay thế cho Elaticsearch cho mô hình hóa mối quan hệ

Mặc dù Elaticsearch cung cấp một số cách giải quyết cho các phép nối kiểu SQL , bao gồm các truy vấn lồng nhau và mối quan hệ cha-con, nhưng người ta khẳng định rằng các mô hình này không có quy mô tốt. Khi thiết kế các ứng dụng trên quy mô lớn, có thể nên xem xét một cách tiếp cận khác với các khả năng nối SQL gốc, Rockset .


Rockset là cơ sở dữ liệu tìm kiếm và phân tích được thiết kế để tìm kiếm, tổng hợp và kết hợp SQL trên bất kỳ dữ liệu nào, bao gồm cả dữ liệu JSON được lồng sâu. Khi dữ liệu được truyền vào Rockset, nó sẽ được mã hóa trong cấu trúc dữ liệu cốt lõi của cơ sở dữ liệu dùng để lưu trữ và lập chỉ mục dữ liệu để truy xuất nhanh. Rockset lập chỉ mục dữ liệu theo cách cho phép truy vấn nhanh, bao gồm cả các phép nối, bằng cách sử dụng trình tối ưu hóa truy vấn dựa trên SQL. Do đó, không cần lập mô hình dữ liệu trả trước để hỗ trợ các phép nối SQL.


Một trong những thách thức với Elaticsearch là làm thế nào để duy trì mối quan hệ một cách hiệu quả khi dữ liệu được cập nhật. Một trong những lý do là Elaticsearch được xây dựng trên Apache Lucene, lưu trữ dữ liệu theo các phân đoạn bất biến, dẫn đến tất cả các tài liệu cần phải được lập chỉ mục lại. Rockset sử dụng RocksDB, một kho lưu trữ khóa-giá trị có nguồn mở bởi Meta và được xây dựng để đột biến dữ liệu, để có thể hỗ trợ hiệu quả các bản cập nhật cấp trường mà không cần phải lập chỉ mục lại toàn bộ tài liệu.

So sánh Elaticsearch và Rockset bằng ví dụ thực tế

Hãy so sánh cách tiếp cận mối quan hệ cha-con trong Elaticsearch với truy vấn SQL trong Rockset.


Trong ví dụ về mối quan hệ cha-con ở trên, chúng tôi đã lập mô hình các bài đăng có nhiều nhận xét bằng cách tạo hai loại tài liệu:


  • bài viết hoặc loại tài liệu gốc

  • nhận xét hoặc các loại tài liệu con


Chúng tôi đã sử dụng mã định danh duy nhất, ID gốc, để thiết lập mối quan hệ giữa tài liệu gốc và tài liệu con. Tại thời điểm truy vấn, chúng tôi sử dụng Elaticsearch DSL để truy xuất nhận xét cho một bài đăng cụ thể.


Trong Rockset, dữ liệu chứa các bài đăng sẽ được lưu trữ trong một bộ sưu tập, một bảng trong thế giới quan hệ, trong khi dữ liệu chứa các nhận xét sẽ được lưu trữ trong một bộ sưu tập riêng biệt. Tại thời điểm truy vấn, chúng tôi sẽ nối dữ liệu lại với nhau bằng truy vấn SQL.


Dưới đây là hai cách tiếp cận song song:


Mối quan hệ cha-con trong Elaticsearch


 POST /blog/posts/1 { "title": "Elasticsearch Modeling", "content": "A post about data modeling in Elasticsearch" } POST /blog/comments/2?parent=1 { "text": "Great post!" } POST /blog/comments/3?parent=1 { "text": "I learned a lot from this." }


Để truy xuất một bài đăng theo tiêu đề và tất cả các nhận xét trong đó, bạn cần tạo một truy vấn như sau.


 GET /posts/_search { "query": { "bool": { "must": [ { "match": { "title": "Exploring Elasticsearch Models" } } ] } }, "inner_hits": { "_source": ["text"], "name": "comments", "path": "comments" } }


SQL trong Rockset

Để truy vấn dữ liệu này, bạn chỉ cần viết một truy vấn SQL đơn giản.


 SELECT p.title, p.content, c.text FROM posts p JOIN comments c ON p.post_id = c.post_id WHERE p.post_id = 1;


Nếu bạn có nhiều bộ dữ liệu cần được kết hợp cho ứng dụng của mình thì Rockset đơn giản hơn và có khả năng mở rộng hơn Elaticsearch. Nó cũng đơn giản hóa các hoạt động vì bạn không cần phải sửa sang lại dữ liệu, quản lý các bản cập nhật hoặc hoạt động lập lại chỉ mục.

Quản lý mối quan hệ trong Elaticsearch

Blog này cung cấp thông tin tổng quan về các loại trường lồng nhau và truy vấn lồng nhau cũng như mối quan hệ cha-con trong Elaticsearch với mục tiêu giúp bạn xác định phương pháp lập mô hình dữ liệu tốt nhất cho khối lượng công việc của bạn.


Các loại trường lồng nhau và truy vấn rất hữu ích cho các mối quan hệ một-một hoặc một-nhiều trong đó mối quan hệ được duy trì trong một tài liệu duy nhất. Đây được coi là một cách tiếp cận đơn giản hơn và có khả năng mở rộng hơn để quản lý mối quan hệ.


Mô hình mối quan hệ cha-con phù hợp hơn với các mối quan hệ một-nhiều đến nhiều-nhiều nhưng có độ phức tạp ngày càng tăng, đặc biệt khi các mối quan hệ cần được chứa trong một phân đoạn cụ thể.


Nếu một trong những yêu cầu chính của ứng dụng của bạn là lập mô hình các mối quan hệ thì việc xem xét Rockset có thể hợp lý. Rockset đơn giản hóa việc lập mô hình dữ liệu và cung cấp một cách tiếp cận có khả năng mở rộng hơn để quản lý mối quan hệ bằng cách sử dụng các phép nối SQL. Bạn có thể so sánh và đối chiếu hiệu suất của Elaticsearch và Rockset bằng cách bắt đầu dùng thử miễn phí với khoản tín dụng 300 USD ngay hôm nay.