Tìm kiếm toàn văn bản với InnoDB


93

Tôi đang phát triển một ứng dụng web khối lượng lớn, trong đó một phần của nó là cơ sở dữ liệu MySQL gồm các bài đăng thảo luận sẽ cần phải tăng lên 20 triệu hàng trở lên một cách suôn sẻ.

Ban đầu tôi dự định sử dụng MyISAM cho các bảng (cho khả năng tìm kiếm văn bản đầy đủ được tích hợp sẵn ), nhưng ý nghĩ về việc toàn bộ bảng bị khóa do một thao tác ghi duy nhất khiến tôi thất vọng. Các khóa cấp độ hàng có ý nghĩa hơn nhiều (chưa kể đến các lợi thế tốc độ khác của InnoDB khi xử lý các bảng lớn). Vì vậy, vì lý do này, tôi khá quyết tâm sử dụng InnoDB.

Vấn đề là ... InnoDB không có khả năng tìm kiếm văn bản đầy đủ được tích hợp sẵn.

Tôi có nên sử dụng hệ thống tìm kiếm của bên thứ ba không? Giống như Lucene (c ++) / Sphinx ? Có bất kỳ ninja cơ sở dữ liệu nào có đề xuất / hướng dẫn không?Zoie của LinkedIn (dựa trên Lucene) có vẻ là lựa chọn tốt nhất vào lúc này... đã được xây dựng dựa trên các khả năng thời gian thực (điều này khá quan trọng đối với ứng dụng của tôi.) Tôi hơi do dự khi cam kết mà chưa có một số thông tin chi tiết ...

(FYI: sẽ có trên EC2 với các giàn bộ nhớ cao, sử dụng PHP để phục vụ giao diện người dùng)


Câu trả lời:


50

Tôi có thể xác nhận rằng MyISAM fulltext là một lựa chọn tồi - thậm chí bỏ qua các vấn đề khác nhau với bảng MyISAM nói chung, tôi đã thấy nội dung đầy đủ đi ra khỏi đường ray và bắt đầu tự làm hỏng và thường xuyên làm hỏng MySQL.

Một công cụ tìm kiếm chuyên dụng chắc chắn sẽ là lựa chọn linh hoạt nhất ở đây - lưu trữ dữ liệu bài đăng trong MySQL / innodb, sau đó xuất văn bản sang công cụ tìm kiếm của bạn. Bạn có thể thiết lập một bản xây dựng / xuất bản chỉ mục đầy đủ định kỳ khá dễ dàng và thêm các bản cập nhật chỉ mục theo thời gian thực nếu bạn cảm thấy cần và muốn dành thời gian.

Lucene và Sphinx là những lựa chọn tốt, cũng như Xapian , nó đẹp và nhẹ. Nếu bạn đi theo con đường Lucene, đừng cho rằng Clucene sẽ tốt hơn, ngay cả khi bạn không muốn vật lộn với Java, mặc dù tôi không thực sự đủ điều kiện để thảo luận về ưu và nhược điểm của cả hai.


7
Solr (dựa trên Lucene) có thể mở rộng quy mô cực lớn và rất mạnh mẽ và linh hoạt. Chúng tôi đã thuê Solr (đặc biệt là phiên bản LucidWorks cho Solr) và tôi có thể nói rằng đó là một chiến thắng lớn. Sphinx cũng có một số hứa hẹn nghiêm túc nhưng cuối cùng việc thiếu các kiểu dữ liệu của nó có thể gây rắc rối cho ứng dụng của chúng tôi ít nhất. Sphinx rất nhanh và nếu nó phù hợp với nhu cầu của bạn thì đó cũng là một lựa chọn chắc chắn.
Cody Caughlan

Cảm ơn hai bạn; phản hồi tuyệt vời. Tôi đã xem qua các tài liệu của Solr, và đó có vẻ như là một giải pháp tuyệt vời để sử dụng. Tôi thấy nó cũng cung cấp cho một số trang web lớn. Tôi nghĩ Solr là vé. Cảm ơn các bạn. Ngoài ra, thật tốt khi biết được chứng đau đầu MyISAM của bạn, Ian ... những điều đó sẽ rất tốt để ghi nhớ trong tương lai. Trong các dự án khác, tôi sẽ không cố gắng sử dụng tính năng toàn văn bản nữa.
brianreavis

11
Có phải tự hỏi điều gì đã khiến Ian nói "đừng cho rằng Clucene sẽ tốt hơn"? với tư cách là một trong những nhóm nòng cốt của clucene, tôi có thể không khách quan như vậy, nhưng đối với tôi, có vẻ như cổng C ++ được tối ưu hóa của bất kỳ thư viện Java nào sẽ tăng hiệu suất của nó lên cao. Tôi khuyên bất cứ ai không nên đăng những nhận xét như vậy mà không có ít nhất một cái nhìn về sản phẩm mà họ đang chán ghét.
synhershko

4
Khi bạn đóng MyISAM, bạn thực sự cần phải cụ thể hơn. "Off the rails" rất mơ hồ và có thể là do một lỗi duy nhất trong bản dựng mà bạn đang sử dụng, có thể đã được sửa.
bobobobo

6
Nhưng điều gì sẽ xảy ra nếu bạn không có tùy chọn cài đặt phần mềm trên máy chủ - những lựa chọn thay thế nào tồn tại trong trường hợp này?
acme

56

Cùng với việc loại bỏ MyISAM nói chung, tìm kiếm toàn văn InnoDB (FTS) cuối cùng cũng có sẵn trong bản phát hành MySQL 5.6.4.

Nhiều chi tiết hấp dẫn tại https://dev.mysql.com/doc/refman/5.6/en/innodb-fulltext-index.html .

Trong khi các công cụ khác có rất nhiều tính năng khác nhau, công cụ này là InnoDB, vì vậy nó là bản địa (có nghĩa là có một đường dẫn nâng cấp) và điều đó làm cho nó trở thành một lựa chọn đáng giá.


1
Điều liên kết được 403 cấm
Marco Demaio

11

Bạn nên dành một giờ để cài đặt và lái thử Sphinx và Lucene. Xem nếu một trong hai đáp ứng nhu cầu của bạn, liên quan đến cập nhật dữ liệu.

Một trong những điều làm tôi thất vọng về Sphinx là nó không hỗ trợ các phép chèn gia tăng rất tốt. Đó là, rất tốn kém để lập chỉ mục sau khi chèn, đắt đến mức giải pháp được đề xuất của họ là chia dữ liệu của bạn thành các hàng cũ hơn, không thay đổi và các hàng mới hơn, dễ bay hơi. Vì vậy, mọi tìm kiếm mà ứng dụng của bạn thực hiện sẽ phải tìm kiếm hai lần: một lần trên chỉ mục lớn hơn cho các hàng cũ và cũng trên chỉ mục nhỏ hơn cho các hàng gần đây. Nếu điều đó không tích hợp với các kiểu sử dụng của bạn, thì Sphinx này không phải là một giải pháp tốt (ít nhất là không phải trong cách triển khai hiện tại của nó).

Tôi muốn chỉ ra một giải pháp khả thi khác mà bạn có thể xem xét: Tìm kiếm Tùy chỉnh của Google . Nếu bạn có thể áp dụng một số SEO cho ứng dụng web của mình, thì hãy thuê ngoài chức năng lập chỉ mục và tìm kiếm cho Google, đồng thời nhúng trường văn bản tìm kiếm của Google vào trang web của bạn. Đó có thể là cách kinh tế nhất và có thể mở rộng để làm cho trang web của bạn có thể tìm kiếm được.


Cảm ơn, Bill. Vâng, tài liệu về Sphinx khiến tôi hơi dao động về cách nó xử lý các bản cập nhật chỉ mục. Tốt để xác nhận nó. Tôi tưởng tượng kiểu hệ thống đó sẽ trở thành cơn ác mộng đối với tôi. Đối với Tìm kiếm Tùy chỉnh của Google, đó là một tùy chọn. Tuy nhiên, vấn đề chính của tôi với điều đó chỉ là chỉ mục không theo thời gian thực và thiếu tùy chỉnh. Tạo kiểu cho kết quả và kéo thêm dữ liệu sẽ khá quan trọng đối với tôi. Cảm ơn vì đã gửi tin nhắn --- thông tin về Sphinx chắc chắn rất tốt để biết!
brianreavis

3

Có lẽ bạn không nên loại bỏ FT của MySQL quá nhanh. Craigslist đã từng sử dụng nó .

Tốc độ của MySQL và Tìm kiếm toàn văn bản đã cho phép craigslist phục vụ người dùng của họ .. craigslist sử dụng MySQL để phục vụ khoảng 50 triệu tìm kiếm mỗi tháng với tốc độ lên đến 60 tìm kiếm mỗi giây. "

biên tập

Như nhận xét bên dưới, Craigslist dường như đã chuyển sang Sphinx vào đầu năm 2009.


Các bài viết liên kết Tôi không đề cập đến Sphinx, và Nik không trích dẫn bất cứ nguồn nào nói Craigslist sử dụng Sphinx ở tất cả
bobobobo

Bản PDF nghiên cứu điển hình giống như từ năm 2004, lúc đó có 50 triệu lượt tìm kiếm mỗi tháng. Trang Sphinx cho biết 50 triệu lượt tìm kiếm mỗi ngày , điều này có thể giải thích lý do họ chuyển sang giải pháp tìm kiếm chuyên dụng.
Halil Özgür

1

Sphinx, như bạn đã chỉ ra, khá tốt cho công cụ này. Tất cả công việc nằm trong tệp cấu hình. Đảm bảo rằng bất kể bảng của bạn là gì với các chuỗi đều có khóa id số nguyên duy nhất và bạn sẽ ổn.


0

thử cái này

ROUND((LENGTH(text) - LENGTH(REPLACE(text, 'serchtext', ''))) / LENGTH('serchtext'),0)!=0

0

Bạn nên xem Sphinx. Lần thử thách này thật có giá trị. Nó được lập chỉ mục cực nhanh và nó được phân phối. Bạn nên xem qua (http://www.percona.com/webinars/2012-08-22-full-text-search-throwdown) webminar. Nó nói về tìm kiếm và có một số điểm chuẩn gọn gàng. Bạn có thể thấy nó hữu ích.



0

Đối với bất kỳ ai bị mắc kẹt trên phiên bản MySQL / MariaDB cũ hơn (tức là người dùng CentOS) trong đó InnoDB không hỗ trợ tìm kiếm Fulltext, giải pháp của tôi khi sử dụng bảng InnoDB là tạo một bảng MyISAM riêng cho thứ tôi muốn tìm kiếm.

Ví dụ, bảng InnoDB chính của tôi productscó nhiều khóa và tính toàn vẹn tham chiếu. Sau đó, tôi tạo một bảng MyISAM đơn giản được gọi là product_searchcó chứa hai trường product_idproduct_namenơi sau này được đặt thành FULLTEXTchỉ mục. Cả hai trường đều là một bản sao của những gì trong productbảng chính .

Sau đó, tôi tìm kiếm trên bảng MyISAM bằng văn bản đầy đủ và thực hiện một phép nối bên trong trở lại bảng InnoDB.

Nội dung của bảng MyISAM có thể được cập nhật thông qua trình kích hoạt hoặc mô hình của ứng dụng.

Tôi sẽ không khuyến nghị điều này nếu bạn có nhiều bảng yêu cầu toàn văn, nhưng đối với một bảng duy nhất, nó có vẻ như là một công việc thích hợp cho đến khi bạn có thể nâng cấp.

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.