Elaticsearch là một công cụ phân tích và tìm kiếm dựa trên phân tán, mã nguồn mở được xây dựng bằng Apache Lucene để cung cấp chức năng tìm kiếm nhanh theo thời gian thực. Theo mặc định, đây là một kho lưu trữ dữ liệu NoSQL hướng tài liệu, có thể mở rộng và không có sơ đồ. Elaticsearch được thiết kế để hoạt động trên quy mô lớn với các tập dữ liệu lớn. Là một công cụ tìm kiếm, nó cung cấp khả năng lập chỉ mục và tìm kiếm nhanh có thể mở rộng theo chiều ngang trên nhiều nút. JSON Trình cắm không biết xấu hổ: là cơ sở dữ liệu lập chỉ mục thời gian thực trên đám mây. Nó tự động xây dựng các chỉ mục được tối ưu hóa không chỉ cho tìm kiếm mà còn cho các tập hợp và liên kết, giúp ứng dụng của bạn truy vấn dữ liệu nhanh chóng và dễ dàng, bất kể dữ liệu đó đến từ đâu và ở định dạng gì. Nhưng bài đăng này nói về việc nêu bật một số cách giải quyết , trong trường hợp bạn thực sự muốn thực hiện các phép nối kiểu SQL trong Elaticsearch. Rockset Tại sao mối quan hệ dữ liệu lại quan trọng? Chúng ta đang sống trong một thế giới có tính kết nối cao, nơi việc xử lý các mối quan hệ dữ liệu là rất quan trọng. Cơ sở dữ liệu quan hệ xử lý tốt các mối quan hệ, nhưng với các yêu cầu kinh doanh thay đổi liên tục, lược đồ cố định của các cơ sở dữ liệu này dẫn đến các vấn đề về khả năng mở rộng và hiệu suất. Việc sử dụng kho lưu trữ dữ liệu NoSQL ngày càng trở nên phổ biến do khả năng giải quyết một số thách thức liên quan đến các phương pháp xử lý dữ liệu truyền thống. Các doanh nghiệp đang liên tục xử lý các cấu trúc dữ liệu phức tạp, trong đó cần có khả năng tổng hợp, nối và lọc để phân tích dữ liệu. Với sự bùng nổ của dữ liệu phi cấu trúc, ngày càng có nhiều trường hợp sử dụng yêu cầu kết hợp dữ liệu từ các nguồn khác nhau cho mục đích phân tích dữ liệu. Mặc dù các phép nối chủ yếu là một khái niệm SQL nhưng chúng cũng quan trọng không kém trong thế giới NoSQL. Các phép nối kiểu SQL không được hỗ trợ trong Elaticsearch với tư cách là công dân hạng nhất. Bài viết này sẽ thảo luận về cách xác định các mối quan hệ trong Elaticsearch bằng cách sử dụng các kỹ thuật khác nhau như không chuẩn hóa, nối phía ứng dụng, tài liệu lồng nhau và mối quan hệ cha-con. Nó cũng sẽ khám phá các trường hợp sử dụng và những thách thức liên quan đến từng phương pháp tiếp cận. Cách giải quyết các mối quan hệ trong Elaticsearch Vì Elaticsearch không phải là cơ sở dữ liệu quan hệ nên các phép nối không tồn tại dưới dạng chức năng gốc như trong cơ sở dữ liệu SQL. Nó tập trung nhiều hơn vào hiệu quả tìm kiếm thay vì hiệu quả lưu trữ. Dữ liệu được lưu trữ trên thực tế được làm phẳng hoặc không chuẩn hóa để thúc đẩy các trường hợp sử dụng tìm kiếm nhanh. Có nhiều cách để xác định mối quan hệ trong Elaticsearch. Dựa trên trường hợp sử dụng của bạn, bạn có thể chọn một trong các kỹ thuật dưới đây trong Elaticsearch để lập mô hình dữ liệu của mình: Mối quan hệ một-một: Ánh xạ đối tượng Mối quan hệ một-nhiều: Tài liệu lồng nhau và mô hình cha-con Mối quan hệ nhiều-nhiều: Không chuẩn hóa và tham gia phía ứng dụng Ánh xạ đối tượng một-một rất đơn giản và sẽ không được thảo luận nhiều ở đây. Phần còn lại của blog này sẽ trình bày chi tiết hơn về hai kịch bản còn lại. Quản lý mô hình dữ liệu của bạn trong Elaticsearch Có bốn cách tiếp cận phổ biến để quản lý dữ liệu trong Elaticsearch: Không chuẩn hóa Tham gia phía ứng dụng Các đối tượng lồng nhau Mối quan hệ cha mẹ và con cái Không chuẩn hóa Tính năng không chuẩn hóa mang lại hiệu suất tìm kiếm truy vấn tốt nhất trong Elaticsearch vì việc kết hợp các tập dữ liệu tại thời điểm truy vấn là không cần thiết. Mỗi tài liệu là độc lập và chứa tất cả dữ liệu cần thiết, do đó loại bỏ nhu cầu thực hiện các thao tác nối tốn kém. Với tính năng không chuẩn hóa, dữ liệu được lưu trữ trong cấu trúc phẳng tại thời điểm lập chỉ mục. Mặc dù điều này làm tăng kích thước tài liệu và dẫn đến việc lưu trữ dữ liệu trùng lặp trong mỗi tài liệu. Dung lượng ổ đĩa không phải là một mặt hàng đắt tiền và do đó ít gây lo ngại. Các trường hợp sử dụng cho việc không chuẩn hóa Trong khi làm việc với các hệ thống phân tán, việc phải tham gia các tập dữ liệu trên mạng có thể gây ra độ trễ đáng kể. Bạn có thể tránh những thao tác nối tốn kém này bằng cách không chuẩn hóa dữ liệu. Mối quan hệ nhiều-nhiều có thể được xử lý bằng cách làm phẳng dữ liệu. Những thách thức với việc không chuẩn hóa dữ liệu Sao chép dữ liệu vào các tài liệu dẹt đòi hỏi không gian lưu trữ bổ sung. Việc quản lý dữ liệu trong cấu trúc phẳng sẽ phát sinh thêm chi phí cho các tập dữ liệu có tính chất quan hệ. Từ góc độ lập trình, việc không chuẩn hóa đòi hỏi chi phí kỹ thuật bổ sung. Bạn sẽ cần viết mã bổ sung để làm phẳng dữ liệu được lưu trữ trong nhiều bảng quan hệ và ánh xạ nó tới một đối tượng duy nhất trong Elaticsearch. Việc không chuẩn hóa dữ liệu không phải là ý tưởng hay nếu dữ liệu của bạn thay đổi thường xuyên. Trong những trường hợp như vậy, việc không chuẩn hóa sẽ yêu cầu cập nhật tất cả các tài liệu khi bất kỳ tập hợp con dữ liệu nào thay đổi và do đó nên tránh. Hoạt động lập chỉ mục mất nhiều thời gian hơn với các tập dữ liệu được làm phẳng vì có nhiều dữ liệu hơn được lập chỉ mục. Nếu dữ liệu của bạn thay đổi thường xuyên, điều này cho thấy tỷ lệ lập chỉ mục của bạn cao hơn, điều này có thể gây ra các vấn đề về hiệu suất của cụm. Tham gia phía ứng dụng Các phép nối phía ứng dụng có thể được sử dụng khi có nhu cầu duy trì mối quan hệ giữa các tài liệu. Dữ liệu được lưu trữ trong các chỉ mục riêng biệt và các thao tác nối có thể được thực hiện từ phía ứng dụng trong thời gian truy vấn. Tuy nhiên, điều này đòi hỏi phải chạy các truy vấn bổ sung vào thời điểm tìm kiếm từ ứng dụng của bạn để nối các tài liệu. Các trường hợp sử dụng cho việc tham gia phía ứng dụng Các phép nối phía ứng dụng đảm bảo rằng dữ liệu vẫn được chuẩn hóa. Các sửa đổi được thực hiện ở một nơi và không cần phải cập nhật liên tục tài liệu của bạn. Sự dư thừa dữ liệu được giảm thiểu với phương pháp này. Phương pháp này hoạt động tốt khi có ít tài liệu hơn và ít thay đổi dữ liệu hơn. Những thách thức với việc tham gia phía ứng dụng Ứng dụng cần thực hiện nhiều truy vấn để nối các tài liệu tại thời điểm tìm kiếm. Nếu tập dữ liệu có nhiều người sử dụng, bạn sẽ cần thực hiện cùng một bộ truy vấn nhiều lần, điều này có thể dẫn đến các vấn đề về hiệu suất. Do đó, cách tiếp cận này không tận dụng được sức mạnh thực sự của Elaticsearch. Cách tiếp cận này dẫn đến sự phức tạp ở cấp độ thực hiện. Nó yêu cầu viết mã bổ sung ở cấp ứng dụng để thực hiện các hoạt động nối nhằm thiết lập mối quan hệ giữa các tài liệu. Đối tượng lồng nhau Cách tiếp cận lồng nhau có thể được sử dụng nếu bạn cần duy trì mối quan hệ của từng đối tượng trong mảng. Các tài liệu lồng nhau được lưu trữ nội bộ dưới dạng các tài liệu Lucene riêng biệt và có thể được nối vào thời điểm truy vấn. Chúng là các phép nối theo thời gian chỉ mục, trong đó nhiều tài liệu Lucene được lưu trữ trong một khối duy nhất. Từ góc độ ứng dụng, khối trông giống như một tài liệu Elaticsearch. Do đó, việc truy vấn tương đối nhanh hơn vì tất cả dữ liệu đều nằm trong cùng một đối tượng. Các tài liệu lồng nhau xử lý các mối quan hệ một-nhiều. Các trường hợp sử dụng cho các tài liệu lồng nhau Việc tạo các tài liệu lồng nhau được ưu tiên hơn khi tài liệu của bạn chứa các mảng đối tượng. Hình 1 bên dưới cho thấy cách kiểu lồng nhau trong Elaticsearch cho phép các mảng đối tượng được lập chỉ mục nội bộ dưới dạng tài liệu Lucene riêng biệt. Lucene không có khái niệm về các đối tượng bên trong, do đó thật thú vị khi xem cách Elaticsearch biến đổi nội bộ tài liệu gốc thành các trường đa giá trị được làm phẳng. Một lợi thế của việc sử dụng truy vấn lồng nhau là nó sẽ không thực hiện đối sánh nhiều đối tượng, do đó tránh được kết quả khớp không mong muốn. Nó nhận thức được ranh giới của đối tượng, giúp việc tìm kiếm trở nên chính xác hơn. Hình 1: Mảng đối tượng được lập chỉ mục nội bộ dưới dạng tài liệu Lucene riêng biệt trong Elaticsearch bằng cách sử dụng phương pháp lồng nhau Những thách thức với các đối tượng lồng nhau Đối tượng gốc và các đối tượng lồng nhau của nó phải được lập chỉ mục lại hoàn toàn để thêm/cập nhật/xóa đối tượng lồng nhau. Nói cách khác, việc cập nhật bản ghi con sẽ dẫn đến việc lập chỉ mục lại toàn bộ tài liệu. Các tài liệu lồng nhau không thể được truy cập trực tiếp. Chúng chỉ có thể được truy cập bằng tài liệu gốc liên quan của nó. Yêu cầu tìm kiếm trả về toàn bộ tài liệu thay vì chỉ trả về các tài liệu lồng nhau phù hợp với truy vấn tìm kiếm. Nếu tập dữ liệu của bạn thay đổi thường xuyên, việc sử dụng các tài liệu lồng nhau sẽ dẫn đến số lượng cập nhật lớn. Mối quan hệ cha mẹ và con cái Mối quan hệ cha-con tận dụng để tách biệt hoàn toàn các đối tượng có mối quan hệ thành các tài liệu riêng lẻ—cha và con. Điều này cho phép bạn lưu trữ tài liệu theo cấu trúc quan hệ trong các tài liệu Elaticsearch riêng biệt có thể được cập nhật riêng. kiểu dữ liệu nối Mối quan hệ cha mẹ con cái có lợi khi tài liệu cần được cập nhật thường xuyên. Do đó, cách tiếp cận này lý tưởng cho các tình huống khi dữ liệu thay đổi thường xuyên. Về cơ bản, bạn tách tài liệu cơ sở thành nhiều tài liệu chứa cha và con. Điều này cho phép cả tài liệu cha và tài liệu con được lập chỉ mục/cập nhật/xóa độc lập với nhau. Tìm kiếm trong tài liệu dành cho phụ huynh và trẻ em Để tối ưu hóa hiệu suất Elaticsearch trong quá trình lập chỉ mục và tìm kiếm, khuyến nghị chung là đảm bảo kích thước tài liệu không lớn. Bạn có thể tận dụng mô hình cha-con để chia tài liệu của mình thành các tài liệu riêng biệt. Tuy nhiên, có một số thách thức khi thực hiện điều này. Tài liệu gốc và tài liệu con cần được định tuyến đến cùng một phân đoạn để việc kết hợp chúng trong thời gian truy vấn sẽ có hiệu quả trong bộ nhớ. ID gốc cần được sử dụng làm giá trị định tuyến cho tài liệu con. Trường cung cấp cho Elaticsearch ID và loại tài liệu gốc, nội bộ này cho phép nó định tuyến các tài liệu con đến cùng phân đoạn với tài liệu gốc. _parent Elaticsearch cho phép bạn tìm kiếm từ các đối tượng JSON phức tạp. Tuy nhiên, điều này đòi hỏi sự hiểu biết thấu đáo về cấu trúc dữ liệu để truy vấn nó một cách hiệu quả. Mô hình cha-con tận dụng nhiều bộ lọc để đơn giản hóa chức năng tìm kiếm: truy vấn has_child Trả về tài liệu cha có tài liệu con phù hợp với truy vấn. truy vấn has_parent Chấp nhận cha mẹ và trả lại các tài liệu con mà cha mẹ liên kết đã khớp. truy vấn inner_hits Tìm nạp thông tin trẻ em có liên quan từ truy vấn . has_child Hình 2 cho thấy cách bạn có thể sử dụng mô hình cha-con để thể hiện mối quan hệ một-nhiều. Các tài liệu con có thể được thêm/xóa/cập nhật mà không ảnh hưởng đến tài liệu gốc. Điều tương tự cũng đúng đối với tài liệu gốc, tài liệu này có thể được cập nhật mà không cần lập chỉ mục lại tài liệu con. Hình 2: Mô hình cha-con cho mối quan hệ một-nhiều Những thách thức với mối quan hệ cha mẹ và con cái Các truy vấn đắt hơn và tốn nhiều bộ nhớ hơn do thao tác nối. Có một chi phí chung đối với các cấu trúc cha-con vì chúng là các tài liệu riêng biệt phải được nối vào thời điểm truy vấn. Cần đảm bảo rằng cha mẹ và tất cả các con của nó tồn tại trên cùng một phân đoạn. Việc lưu trữ tài liệu với mối quan hệ cha-con liên quan đến việc triển khai phức tạp. Phần kết luận Việc chọn thiết kế Elaticsearch phù hợp là rất quan trọng đối với hiệu suất và khả năng bảo trì của ứng dụng. Khi thiết kế mô hình dữ liệu của bạn trong Elaticsearch, điều quan trọng cần lưu ý là những ưu và nhược điểm khác nhau của từng phương pháp lập mô hình được thảo luận ở đây. mô hình hóa dữ liệu Trong bài viết này, chúng ta đã khám phá cách các đối tượng lồng nhau và mối quan hệ cha-con kích hoạt các hoạt động nối giống như SQL trong Elaticsearch. Bạn cũng có thể triển khai logic tùy chỉnh trong ứng dụng của mình để xử lý các mối quan hệ với các phép nối phía ứng dụng. Đối với các trường hợp sử dụng mà bạn cần kết hợp nhiều tập dữ liệu trong Elaticsearch, bạn có thể nhập và tải cả hai tập dữ liệu này vào chỉ mục Elaticsearch để cho phép truy vấn hiệu quả. Ra khỏi hộp, Elaticsearch không có các phép nối như trong cơ sở dữ liệu SQL. Mặc dù có những cách giải quyết tiềm năng để thiết lập mối quan hệ trong tài liệu của bạn, nhưng điều quan trọng là phải nhận thức được những thách thức mà mỗi cách tiếp cận này đưa ra. Sử dụng SQL gốc kết hợp với Rockset Khi có nhu cầu kết hợp nhiều tập dữ liệu để phân tích thời gian thực, cơ sở dữ liệu cung cấp các phép nối SQL gốc có thể xử lý trường hợp sử dụng này tốt hơn. Giống như Elaticsearch, Rockset được sử dụng làm lớp lập chỉ mục trên dữ liệu từ cơ sở dữ liệu, luồng sự kiện và hồ dữ liệu, cho phép nhập dữ liệu không theo sơ đồ từ các nguồn này. Không giống như Elaticsearch, Rockset cung cấp khả năng , bao gồm cả các phép nối, giúp bạn linh hoạt hơn trong cách sử dụng dữ liệu của mình. truy vấn bằng SQL đầy đủ tính năng Cũng được xuất bản . ở đây