Kết hợp tìm kiếm DB quan hệ và tìm kiếm đàn hồi


7

Chúng tôi có một lượng lớn các tệp văn bản mà chúng tôi muốn tìm kiếm văn bản tự do / toàn văn bản, kết hợp với siêu dữ liệu có cấu trúc quan hệ về tệp văn bản. Vì vậy, một tìm kiếm có thể là "Đưa cho tôi tất cả các tệp thuộc nhóm X (hoặc nhóm phụ của X), có tác giả (Ari và Bari và Mari), thuộc về tổ chức Y và chứa văn bản" tổng hợp ". Phần sau là một tìm kiếm toàn văn và cái khác đã được lưu trữ dưới dạng dữ liệu quan hệ trong db hiện có của chúng tôi.

Trong cơ sở dữ liệu của chúng tôi (khá phức tạp), đã lưu trữ một cách để ID các tệp và một tấn siêu dữ liệu khác nhau về tệp, trải rộng giữa hàng chục bảng, từ các mối quan hệ 1-1 đơn giản, đến 1 bộ nhiều pr tệp và thậm chí mối quan hệ cấu trúc cây (những thứ như "tệp này là loại X, loại X là nhóm con loại Y, v.v.). Siêu dữ liệu này có thể thay đổi theo thời gian, trên toàn bộ ứng dụng (rất lớn).

Bây giờ, tôi với tư cách là quản trị viên cơ sở dữ liệu, đã nghĩ rằng điều này có thể được giải quyết bằng cách sử dụng SQL Server để thực hiện tìm kiếm siêu dữ liệu có cấu trúc đã có trong DB, hạn chế tìm kiếm các tệp ứng cử viên, sau đó chuyển id của tệp ứng cử viên để tìm kiếm đầy đủ tìm kiếm văn bản. (Lập chỉ mục lại tệp trên đàn hồi khi một tệp được thêm hoặc cam kết là không đáng kể trong mã của chúng tôi)

Tuy nhiên, những người đàn ông trong dự án của chúng tôi tự nhiên có một ý tưởng khác: Trích xuất tất cả dữ liệu meta cũng như nội dung toàn văn bản từ các tệp, để tìm kiếm đàn hồi và chạy tìm kiếm một cách linh hoạt.

Điều này cho phép họ chạy các truy vấn lucene được cung cấp đầy đủ một cách dễ dàng và tải được lấy ra khỏi cơ sở dữ liệu, điều này thật tuyệt. Tuy nhiên, điều này cũng với tôi, giới thiệu một cơn ác mộng để giữ cho siêu dữ liệu có cấu trúc được đồng bộ hóa và lập chỉ mục / đồng bộ hóa một cách mù quáng mọi thứ theo định kỳ là không thể do quy mô dữ liệu.

Tôi có thể thấy công đức / mối quan tâm cho cả hai lựa chọn. Có một thực hành tốt nhất cho loại điều này?


Có phải tất cả các hoạt động thô sơ tập trung trong một tập hợp các chức năng của lớp nghiệp vụ? Bạn đang chạy trong một trung tâm dữ liệu hoặc trong một nhà cung cấp đám mây?
Aaron

@Aaron Có, các hoạt động thô được tập trung trong một tập hợp các chức năng của lớp nghiệp vụ. Nhưng có rất nhiều trong số chúng, trong một ứng dụng kế thừa khổng lồ, do đó không dễ dàng đăng nhập / đồng bộ hóa tất cả các cách sử dụng và ghi nhớ để làm điều đó trong tương lai (lỗi tiềm năng trong tương lai) - nhưng tất nhiên là có thể. Chúng tôi đang chạy trong một trung tâm dữ liệu.
Henrik Alstad

Câu trả lời:


3

Sử dụng cả hai.

Có một dòng cần được vẽ bởi bạn và nhóm của bạn ở đây. SQLSERVER đắt hơn so với tính năng Tìm kiếm đàn hồi, vì vậy khi tôi gặp phải một vấn đề tương tự, việc sử dụng tài nguyên CPU cho elaticsearch sẽ tốt hơn so với máy chủ sqls.

Có một vài điều có thể khiến bạn quyết định lập chỉ mục dữ liệu văn bản của bạn trong elaticsearch

Những loại tải bạn đang xem?

Một vài tìm kiếm mỗi phút hoặc hàng chục mỗi giây? Đây là chủ quan nhưng một lần nữa nếu một lượng lớn tài nguyên cơ sở dữ liệu của bạn được sử dụng cho một truy vấn này, bạn có thể muốn giảm tải điều đó.

Giữ dữ liệu của bạn có cấu trúc

Tôi thấy ngôn ngữ truy vấn elaticsearch ít trực quan hơn SQL. Tôi thực sự khuyên bạn nên có một phiên bản dữ liệu càng bình thường càng tốt trong cơ sở dữ liệu quan hệ chuẩn. Sau đó căn cứ chỉ số đàn hồi của bạn vào đó.

Elaticsearch là tuyệt vời ở nhiều thứ nhưng viết các truy vấn ad hoc phức tạp với các tập hợp và / hoặc truy vấn con không phải là một trong số đó.

Làm thế nào để bạn đồng bộ dữ liệu sau đó?

Kích hoạt và hàng đợi là những gì tôi đã sử dụng.

Thêm một kích hoạt trên bảng có dữ liệu bạn muốn theo dõi. Đây là một trong những hàng đợi tôi đã thực hiện trông như thế nào.

xếp hàng

Trình kích hoạt ghi lại hành động (chèn / cập nhật / xóa) và từ đó bạn biết phải làm gì trong chỉ mục Elaticsearch của mình. Tôi đã thấy việc xây dựng lại toàn bộ hồ sơ trong đàn hồi không quá tốn kém nên đây là việc tôi làm.

Bằng cách này, bạn có thể thực hiện một dự án với cơ sở mã lớn và lập chỉ mục bất kỳ dữ liệu nào bạn muốn trong elaticsearch mà không phải thực hiện bất kỳ thay đổi mã nào. Mọi thứ được xử lý theo trạng thái dữ liệu của bạn trong RDBMS bạn chọn.

Elaticsearch (và tất cả các kho lưu trữ tài liệu / nosql khác) có các trường hợp sử dụng đáng kinh ngạc nhưng việc lưu trữ dữ liệu quan hệ làm cơ sở dữ liệu chính không phải là một trong số đó. Sử dụng cơ sở dữ liệu quan hệ cho điều đó.


Tôi chắc chắn sẽ sử dụng cả hai. SQL Server cho dữ liệu quan hệ / có cấu trúc và Đàn hồi cho tìm kiếm toàn văn. Câu hỏi là "dữ liệu ở giữa", nghĩa là dữ liệu có cấu trúc cũng sẽ là một phần của tìm kiếm. Nếu chúng ta làm phẳng nó và sao chép nó vào tìm kiếm đàn hồi, nó sẽ cải thiện hiệu suất và cho phép elaticsearch thực hiện toàn bộ hoạt động truy vấn. Nhưng như bạn đề cập, chúng tôi sẽ cần phải đồng bộ dữ liệu. Một trình kích hoạt SAU có thể làm điều đó, như bạn đã đề cập. Nó có thể là một điều rất tốn kém, vì có một số lượng lớn các bản cập nhật cho các bảng. Tôi có thể mất nhiều hơn số tiền tôi đạt được, thậm chí chỉ tính hiệu suất
Henrik Alstad

Cơ sở dữ liệu tôi đã cài đặt một quy trình như vậy cũng có một lượng lớn các bản cập nhật. Bản thân trình kích hoạt không phải là phần nặng nhất của quy trình, việc làm phẳng dữ liệu thành một hàng để khớp với hình dạng tài liệu của đàn hồi là khá nặng đối với tôi. Vì vậy, ngay cả khi có 100k cập nhật trên bảng, thường thì bản ghi tương tự sẽ được cập nhật để tôi chỉ có 1000 bản ghi duy nhất để đồng bộ hóa, tại thời điểm đó, nó sẽ sôi sục để tối ưu hóa truy vấn và giảm tải tài nguyên xử lý khỏi máy chủ cơ sở dữ liệu của bạn để duy trì chi phí -Có hiệu quả.
A_V
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.