banner
Feb 7, 2023
225 Views

Join giữa các index Elasticsearch với nhau

Written by
banner

Mở đầu và cài đặt

Khi làm việc với Elasticsearch, nhược điểm dễ nhận thấy nhất là Elasticsearch không hề có JOIN giữa các index khác hẳn nhau như những hệ thống RDBMS hoặc 1 số hệ thống NoSQL khác.

Tất nhiên theo sách vở thì mọi người khuyên chúng ta nên denormalize trước khi đưa vào elasticsearch, nhưng khi dữ liệu lớn và đặc thù thì việc denormalize sẽ tạo nên rất nhiều bất cập:

  • Khiến dữ liệu phình to ra do lưu các dữ liệu trùng lặp nhau. Ví dụ trong bảng product mà có chứa các objects supplier, brand.... có khi làm dữ liệu phình ra gấp 2-3 lần.
  • Khiến việc update không hiệu quả. Ví dụ bạn có 50 triệu sản phẩm trong 1 index, có 1 object con trong đó phải update khiến cả triệu sản phẩm có cùng object đó phải update thì quả thực là ác mộng.
  • ...

Trong bài này tôi sẽ giới thiệu 1 phương pháp là dùng plugin Siren Federate để thực hiện các tác vụ cần JOIN.

Bước 1: Cài elasticsearch và kibana như hướng dẫn sau.

Bước 2: Bạn phải cài đặt plugin, tôi đã sửa và để sẵn 1 bản plugin tương thích với Elasticsearch 7.17.9 (là bản cuối cùng của elasticsearch 7):

Bước 3: Đưa dữ liệu mẫu vào elasticsearch thông qua kibana:

Chúng ta sẽ cùng tìm hiểu 2 loại JOIN mà siren federate hỗ trợ gồm:

Semi-join

Dùng để lọc 1 tập document A dựa trên 1 tập documents khác là B. Khi dùng semi-join siren sẽ trả về các documents A thỏa mãn điều kiện join. Việc này tương đương với hàm EXISTS() ở SQL

Ví dụ: chúng ta muốn tìm xem ở các bài báo có sẵn có các bài nào nhắc tới các công ty có chữ technologies ở tên công ty:

Inner-join

Dùng để nối các trường tùy ý của index B vào index A.

Ví dụ: bạn muốn tìm xem các công ty trong index company được nhắc tới trong bài báo ở các năm nào

Lưu ý:

  • Siren hiện thời chỉ hỗ trợ join 2 index với nhau.
  • Join số hiệu quả hơn join string. Bạn nên xem xét murmur hash các giá trị string trước khi index.
  • Bạn có thể tìm hiểu các API mà siren hỗ trợ tại đây: https://docs.siren.io/siren-federate-user-guide/29.2/siren-federate/search-apis.html
Article Categories:
dev
banner

Leave a Reply

Your email address will not be published. Required fields are marked *