2015-07-23 23 views
5

Khi thiết lập một combo MySQL/ElasticSearch, nó là tốt hơn để:Làm cách nào để giữ các mô hình chuẩn hóa khi tìm kiếm qua ElasticSearch?

  1. Hoàn toàn đồng bộ hóa tất cả các thông tin mô hình để ES (ngay cả những dữ liệu không tìm kiếm), để khi kết quả một được tìm thấy, tôi có tất cả thông tin của nó tiện dụng.

  2. Chỉ đồng bộ hóa các trường có thể tìm kiếm và sau đó khi tôi nhận lại kết quả, hãy sử dụng trường id để tìm dữ liệu thực tế trong cơ sở dữ liệu MySQL?

Trả lời

2

ElasticSearch là công cụ tìm kiếm. Tôi khuyên bạn không nên sử dụng nó như một hệ thống cơ sở dữ liệu. Tôi đề nghị bạn chỉ lập chỉ mục dữ liệu tìm kiếm và một id duy nhất từ ​​cơ sở dữ liệu của bạn để bạn có thể truy xuất kết quả từ MySQL bằng cách sử dụng khóa duy nhất được trả về bởi ElasticSearch. Bằng cách này, bạn sẽ sử dụng cả hai ứng dụng cho những gì họ đang dự định. Tìm kiếm đàn hồi không phải là tốt nhất cho các truy vấn quan hệ và bạn sẽ phải viết nhiều mã hơn để hoạt động trên các dữ liệu liên quan hơn là chỉ sử dụng MySql cho nó.

Ngoài ra, bạn không muốn kết hợp lớp kiên trì với lớp tìm kiếm. Những điều này nên độc lập nhất có thể, và thay đổi trong một không nên ảnh hưởng đến người khác, càng nhiều càng tốt. Nếu không, bạn sẽ phải cập nhật cả hai hệ thống của mình nếu có phải thay đổi. Truy vấn MySQL trên một số ID là rất nhanh, vì vậy bạn có thể sử dụng nó và để phần chậm (truy vấn toàn văn) để tìm kiếm đàn hồi.

7

Mô hình dữ liệu Elasticsearch thích dữ liệu không chuẩn hóa thường. Tùy thuộc vào trường hợp sử dụng (số lượng lớn dữ liệu, máy không đủ mạnh, quá ít nút vv) giữ mối quan hệ trong ES (cha mẹ-con) để bắt chước các kết nối bên trong và tương tự từ thế giới RDB là tốn kém.

Câu hỏi của bạn rất cởi mở và câu trả lời phụ thuộc vào trường hợp sử dụng. Nói chung:

  • tránh bắt chước Tables chính xác DB - chỉ số ES plus mối quan hệ của họ
  • lợi thế của việc giữ mọi thứ trong ES là bạn không cần phải cập nhật cả hai cơ chế đồng thời
  • nếu bạn dữ liệu tìm kiếm có thể rất nhỏ so với tổng số dữ liệu, tôi không thấy lý do tại sao bạn không thể đồng bộ hóa dữ liệu có thể tìm kiếm với ES
  • cố gắng làm phẳng dữ liệu trong ES và chống lại bất kỳ xung sử dụng nào cha mẹ/con chỉ vì đây là cách thực hiện trong MySQL
  • Tôi không có t nói rằng bạn không thể sử dụng cha/con. Bạn có thể, nhưng chắc chắn rằng bạn kiểm tra này trước khi áp dụng cách tiếp cận này và chắc chắn rằng bạn là ok với thời gian phản ứng. Đây là, dù sao, một lời khuyên hợp lệ cho bất kỳ loại phương pháp bạn chọn.
1

Mặc dù nó phụ thuộc vào tình hình, tôi sẽ đề nghị bạn để đi với # 2:

  • nhanh hơn khi lập chỉ mục: chúng tôi chỉ lấy dữ liệu tìm kiếm từ DB và chỉ số để ES, so sánh để lấy tất cả và chỉ mục tất cả
  • Kích thước bộ nhớ nhỏ hơn: vì dữ liệu được lập chỉ mục nhỏ hơn # 1, việc sao lưu, phục hồi, khôi phục, nâng cấp ES của bạn trở nên dễ dàng hơn trong sản xuất. Nó cũng sẽ giữ kích thước lưu trữ của bạn nhỏ khi dữ liệu của bạn tăng lên và bạn cũng có thể xem xét sử dụng SSD để nâng cao hiệu suất với chi phí thấp hơn.
  • Nói chung, ứng dụng tìm kiếm sẽ tìm kiếm trên một số trường và hiển thị tất cả dữ liệu có thể có cho người dùng. Ví dụ: tìm kiếm sản phẩm nhưng sẽ hiển thị thông tin giá/cổ phiếu .. trong trang kết quả, chỉ có sẵn trong DB. Vì vậy, đó là bản chất để có một bước thứ 2 để truy vấn thêm thông tin trong DB và kết hợp nó với kết quả tìm kiếm để hiển thị.

Hy vọng điều đó sẽ hữu ích.

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