PostgreSQL (Tìm kiếm toàn văn bản) so với Tìm kiếm đàn hồi


10

Xin chào Tôi đang thực hiện một số nghiên cứu trước khi tôi triển khai tính năng tìm kiếm vào dịch vụ của mình. Tôi hiện đang sử dụng PostgreSQL làm bộ lưu trữ chính của mình. Tôi chắc chắn có thể sử dụng Tìm kiếm toàn văn bản tích hợp của PostgreSQL nhưng vấn đề là tôi có dữ liệu nằm rải rác xung quanh một số bảng.

Dịch vụ của tôi là một trang web thương mại điện tử. Vì vậy, nếu một khách hàng tìm kiếm "máy tính xách tay táo tốt", tôi cần tham gia Brandbảng, postbảng và reviewbảng (1 bài đăng là sự kết hợp của một số đánh giá + tóm tắt ngắn) để tìm kiếm đầy đủ tất cả các bài đăng. Nếu tôi sử dụng elaticsearch, tôi có thể chèn các bài viết hoàn chỉnh bằng cách tiền xử lý.

Từ nghiên cứu của tôi, một số người cho biết FTS và elaticsearch của PostgreQuery có hiệu suất tương tự và một số người cho biết elaticsearch nhanh hơn. Đó sẽ là giải pháp tốt hơn cho trường hợp của tôi?

Cảm ơn trước


Làm thế nào để bạn biết từ khóa tìm kiếm có liên quan đến một số bảng bạn đã lưu trữ trong cơ sở dữ liệu của bạn?
Conifers

Tôi không .. Vì vậy, tôi đã nghĩ đến việc tham gia tất cả các cột có thể trong các bảng khác nhau và biến chúng thành ts_vector. Có giải pháp nào tốt hơn không?
Công ty cổ phần

Hmm, điều này sẽ liên quan đến vấn đề nhận dạng ngữ nghĩa và đó là một câu chuyện khác ...
Conifers

Câu trả lời:


-5

Trả lời ngắn gọn: Elaticsearch tốt hơn

Giải thích: PostgreSQL và Elaticsearch là 2 loại cơ sở dữ liệu khác nhau. Elaticsearch là mạnh mẽ để tìm kiếm tài liệu và PostgreSQL vẫn là một RDBMS truyền thống. Kiểm tra mục tiêu của bạn mà bạn có thể muốn tìm kiếm văn bản trong một số bài viết. Bất kể PostgreSQL được thực hiện tốt như thế nào trên các tìm kiếm toàn văn của nó, Elaticsearch được thiết kế để tìm kiếm trong các văn bản và tài liệu khổng lồ (hoặc hồ sơ). Và kích thước bạn có thể muốn tìm kiếm càng nhiều, thì Elaticsearch càng tốt hơn PostgreQuery về hiệu suất. Ngoài ra, bạn cũng có thể nhận được nhiều lợi ích và hiệu suất tuyệt vời nếu bạn xử lý trước các bài đăng thành nhiều lĩnh vực và lập chỉ mục trước khi lưu trữ vào Elaticsearch.

Nếu bạn chắc chắn cần tính năng toàn văn, bạn có thể xem xét MSSQL, có thể làm tốt hơn PostgreQuery.

Trả lời về Nhận xét: Nên so sánh các thuộc tính trên các DB loại khác nhau đó là lẽ thường. Vì OP không cung cấp số lượng và kích thước của dữ liệu được lưu trữ. Nếu đây là dữ liệu tìm kiếm kích thước nhỏ, có thể chọn Postgre hoặc ES đều ổn. Tuy nhiên, nếu giao dịch và kho dữ liệu trở nên lớn hơn trong tương lai, ES sẽ nhận được lợi ích của nó.

Bạn có thể kiểm tra trang web này để biết thứ hạng hiện tại của từng loại DB và chọn loại tốt nhất trong số các yêu cầu, kiến ​​trúc và tăng trưởng dữ liệu trong tương lai của các ứng dụng của bạn.


Đồng ý về việc ẩn dụ nhưng nếu bạn có một số bằng chứng hoặc các nguồn khác, nó sẽ đáng tin cậy hơn.
Jaisus

2
Câu trả lời của bạn chỉ dựa trên ý kiến ​​của bạn, bạn chưa viết bất kỳ ví dụ, điểm chuẩn hoặc liên kết nào để chứng minh quan điểm của mình và tôi không thể thấy câu trả lời khác của bạn về chủ đề có thể chứng minh bạn biết về các phần mềm này. Tôi thấy bạn là một người đóng góp mới, vì vậy tôi sẽ đề nghị bạn cho lần sau không viết câu tuyệt đối và báo cáo kinh nghiệm, dữ liệu thực hoặc liên kết của bạn để chứng minh luận điểm của bạn.
Paolo Melchiorre

@conifers tốt cập nhật và làm rõ câu trả lời của bạn nhưng liên kết bạn đã thêm không chứng minh quan điểm của bạn. Tôi đã quan tâm nếu bạn đã thêm một URL với một so sánh hoặc điểm chuẩn.
Paolo Melchiorre

xếp hạng theo mức độ phổ biến không có nghĩa là Elaticsearch vượt trội hơn PostgreSQL khi nói đến tìm kiếm toàn văn. "Tốt hơn" và "Đó nên là lẽ thường" có nghĩa là chúng tôi hy vọng sẽ thấy một số điểm chuẩn hoặc bài kiểm tra so sánh hai công nghệ đó trong câu trả lời của bạn không có.
Yasser Sinjab

9

Nếu PostgreSQL đã có trong ngăn xếp của bạn, thì tùy chọn tốt nhất cho bạn là sử dụng tìm kiếm toàn văn bản PostgreSQL.

Tại sao tìm kiếm toàn văn bản (FTS) trong PostgreSQL?

Bởi vì nếu không, bạn phải cung cấp nội dung cơ sở dữ liệu cho các công cụ tìm kiếm bên ngoài.

Các công cụ tìm kiếm bên ngoài (ví dụ: elaticsearch) rất nhanh NHƯNG :

  • Họ không thể lập chỉ mục tất cả các tài liệu - có thể hoàn toàn ảo
  • Họ không có quyền truy cập vào các thuộc tính - không có truy vấn phức tạp
  • Chúng phải được duy trì - đau đầu vì DBA
  • Đôi khi họ cần được chứng nhận
  • Họ không cung cấp tìm kiếm tức thì (cần thời gian để tải xuống dữ liệu mới và reindex)
  • Họ không cung cấp tính nhất quán - kết quả tìm kiếm có thể đã bị xóa khỏi cơ sở dữ liệu

Nếu bạn muốn đọc thêm về FTS trong PostgreSQL, có một bài thuyết trình tuyệt vời của Oleg Bartunov (Tôi đã trích xuất danh sách ở trên từ đây): " Bạn có cần Tìm kiếm toàn văn bản trong PostgreQuery không? "

Đây là một ví dụ ngắn về cách bạn có thể tạo "Tài liệu" (đọc tài liệu tìm kiếm văn bản) từ nhiều hơn một bảng trong SQL:

SELECT to_tsvector(posts.summary || ' ' || brands.name) 
FROM posts
INNER JOIN brands ON (brand_id = brands.id);

Nếu bạn đang sử dụng Django cho trang web thương mại điện tử của mình, bạn cũng có thể đọc bài viết này tôi đã viết trên " Tìm kiếm toàn văn bản trong Django với PostgreQuery "


Một cái gì đó về tuyên bố của elaticsearch là sai ... Họ không thể lập chỉ mục tất cả các tài liệu: Chắc chắn bạn có thể! Nếu bạn đã xác định và chuyển đổi nó thành cấu hình của mình trong khi lập chỉ mục, giống như trong PostgreQuery, bạn cần xác định DDL trước. Họ không có quyền truy cập vào các thuộc tính : Có, điều đó có thể đúng do PostgreSQL là cơ sở dữ liệu sử dụng chung, cần hỗ trợ CRUD tốt. Chúng phải được duy trì : Có cần phải duy trì PostgreSQL không? ... Việc sao lưu thường xuyên, điều chỉnh hiệu năng vẫn được yêu cầu cho dù loại DB nào.
Conifers

Họ không cung cấp tìm kiếm tức thì : Chà, ES chỉ mạnh về tìm kiếm tức thì ... trước tiên hãy thử Kibana. Chúng không cung cấp tính nhất quán : Đây có thể là tuyên bố đúng duy nhất do bất kỳ RDBMS nào được yêu cầu trên các thuộc tính ACID.
Conifers

1
Câu hoàn chỉnh là Họ không cung cấp tìm kiếm tức thì (cần thời gian để tải xuống dữ liệu mới và reindex) : có nghĩa là nếu người dùng của bạn trên trang web thương mại điện tử (như trong câu hỏi) mua Item1 cuối cùng có sẵn, thông tin này được lưu trữ ngay lập tức trên PostgreSQL và nếu bạn sử dụng tìm kiếm toàn văn bản của PostgreQuery, những người dùng khác sẽ không tìm thấy Item1 trong phần tìm kiếm. Mặt khác, nếu bạn sử dụng Elasitcsearch, bạn cần có thời gian để gửi thông tin mới này đến Elaticsearch và reindex trước khi những người dùng khác sẽ ngừng nhìn thấy Item1 trong kết quả tìm kiếm. Có thể họ cố gắng mua nó nhưng nó không còn nữa. :-(
Paolo Melchiorre

2
Về tất cả các điểm khác trong danh sách, chỉ có một điều tôi muốn viết: Trong câu hỏi ban đầu @jsc đã viết rằng họ đã có PostgreQuery trong ngăn xếp của họ để dữ liệu đã được lưu trữ ở đó, họ đã có quyền truy cập vào tất cả các thuộc tính để thực thi toàn văn tìm kiếm với truy vấn quan hệ. NHƯNG nếu bạn sử dụng Elaticsearch, bạn phải thêm thời gian để gửi một phần nhỏ dữ liệu (không phải tất cả các thuộc tính) từ PG sang ES, thời gian để reindex dữ liệu trong ES. Khi kết thúc sử dụng ES, bạn sẽ có một dịch vụ khác để quản lý, chiếm nhiều bộ nhớ hơn, nhiều dung lượng lưu trữ hơn để lưu trữ dữ liệu dư thừa và độ trễ trong toàn bộ quá trình của bạn.
Paolo Melchiorre
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.