2011-08-23 35 views
5

Tôi có một cơ sở dữ liệu mysql, nơi một lượng lớn văn bản được liên tục thêm vào. (10 trang văn bản mỗi giờ). Văn bản được lưu trữ dưới dạng văn bản thô trong các trường văn bản. Mỗi hàng liên lạc một trang hoặc hai văn bản.Tìm kiếm số lượng lớn văn bản được cập nhật liên tục trong mysql

Tôi cần thực hiện tìm kiếm văn bản đầy đủ (tìm kiếm từ khóa trong văn bản và thực hiện truy vấn phức tạp) trên cơ sở dữ liệu này một cách thường xuyên. Tôi chỉ cần tìm kiếm văn bản mới được thêm vào. Nhưng nó là rất quan trọng cho văn bản được thêm vào để có thể tìm kiếm ngay lập tức (trong vòng một hoặc hai phút).

Từ những gì tôi đã đọc, toàn văn với mysql không hiệu quả lắm. Tôi biết lucene là một lựa chọn nhưng tôi không chắc chắn như thế nào một cách nhanh chóng nó có thể lập chỉ mục văn bản mới.

Vì vậy, các tùy chọn của tôi là gì? có cách nào để làm cho mysql hiệu quả hơn? là lucene giải pháp tốt nhất của tôi? bất cứ điều gì thích hợp hơn?

nhờ

Trả lời

2

Tôi đã thực hiện đo điểm chuẩn cho Thời gian lập chỉ mục cho Sphinx & Solr. Nhân sư vượt xa so với Solr liên quan đến thuật toán lập chỉ mục (thời gian lập chỉ mục siêu nhanh và kích thước chỉ mục nhỏ).

Khi bạn nói 10 trang văn bản, có vẻ như bạn thậm chí không cần lập chỉ mục Sphinx thời gian thực. Bạn có thể làm theo lược đồ lập chỉ mục + delta chính trong Sphinx (bạn có thể thấy rằng trên Tài liệu Nhân sư). Nó sẽ là siêu nhanh và gần thời gian thực. Nếu bạn muốn được trợ giúp thêm về vấn đề này, vui lòng hỏi, sẽ vui lòng giải thích cho bạn.

Solr là tuyệt vời nhưng khi nói đến thuật toán tối ưu hóa đá nhân sư !! Hãy thử Sphinx.

Đến với câu hỏi của bạn trong nhận xét, Solr/Lucene hỗ trợ lập chỉ mục gia tăng (được gọi là nhập delta trong thuật ngữ của chúng) và cấu hình yên tĩnh dễ dàng, tuy nhiên chúng khá chậm so với phương pháp được Sphinx sử dụng.

Main + Delta đủ nhanh bởi vì những gì bạn có thể làm là tạo bảng tạm thời lưu trữ văn bản mới trong đó và lập chỉ mục đó. Theo tài liệu: Sphinx hỗ trợ cập nhật chỉ mục "sống" (gần như thời gian thực) và có thể được triển khai bằng cách sử dụng được gọi là lược đồ "chính + delta".Ý tưởng là thiết lập hai nguồn và hai chỉ mục, với một chỉ mục "chính" cho dữ liệu và một "delta" cho các tài liệu mới.

Nói ví dụ bạn có 10 triệu bản ghi để bạn có thể giữ điều đó làm chỉ mục chính và tất cả tài liệu mới được thêm vào bảng mới sẽ hoạt động như đồng bằng. Bảng mới này có thể được lập chỉ mục theo thời gian (giả sử mỗi 1 giờ) và dữ liệu có thể tìm kiếm được trong vòng vài giây khi bạn có 10 trang văn bản. Bây giờ sau khi hồ sơ mới của bạn đang được tìm kiếm, bạn có thể hợp nhất các tài liệu của bảng chính + bảng delta có thể được thực hiện mà không can thiệp vào tìm kiếm của bạn. Khi các tài liệu được sáp nhập, hãy làm trống bảng mới và sau một giờ, bạn có thể thực hiện lại toàn bộ quá trình. Tôi hy vọng bạn có được điều đó, xin vui lòng hỏi bất kỳ câu hỏi nào.

+0

Cảm ơn bạn đã giúp đỡ của bạn. Từ những gì tôi đọc chính + delta là chính xác những gì tôi cần. Nhưng có một điểm không rõ ràng trong tài liệu; họ nói nó sẽ giảm thời gian lập chỉ mục xuống còn 30 đến 60 giây. Trong trường hợp của tôi, nó là rất quan trọng để có văn bản mới sẵn sàng để được tìm kiếm trong vòng vài giây (tối đa một phút). Là đồng bằng chính đủ nhanh? Từ những gì tôi thấy Nhân sư là con đường để đi. – applechief

+0

Bạn được chào đón nhiều nhất. Bạn có thể xem câu trả lời đã chỉnh sửa của tôi ở trên. Main + Delta sẽ làm việc tuyệt vời cho bạn vì lập chỉ mục Sphinx thực sự rất nhanh. Tuy nhiên một điều nữa: Xin vui lòng cũng có một cái nhìn tại các chỉ số thời gian thực trong Sphinx như đã đề cập trong một trong những câu trả lời ở trên, tôi chưa bao giờ sử dụng nó nhưng nó có vẻ đầy hứa hẹn. Sau khi áp dụng cả hai cho dữ liệu của bạn, bạn có thể kiểm tra những gì phù hợp nhất với bạn. – Yavar

2

Bạn có một vài lựa chọn:

  • Sphinx Search: có thể tích hợp trực tiếp với MySQL DB của bạn. Có hỗ trợ cho các chỉ mục thời gian thực, có giới hạn

  • Solr/Lucene: Nạp dữ liệu qua JSON hoặc XML từ DB của bạn. Có khả năng truy vấn phong phú. Phiên bản hiện tại không phải là thời gian thực w/o một số xây dựng cạnh. Bạn phải lập chỉ mục lại dữ liệu của bạn và cam kết nó để thay đổi xuất hiện. Tùy thuộc vào số lượng dữ liệu của bạn, bạn có thể thực hiện cam kết mỗi 10 phút. Điều này sẽ không là vấn đề cho đến khi bạn có tài liệu 100K/1M + vì Lucene rất nhanh trong việc lập chỉ mục. 10 trang/giờ là khá tầm thường.

  • ElasticSearch: Có Java dựa trên Solr/Lucene nhưng dường như thực sự là "gần thời gian thực" đủ. Thiết kế của nó ra khỏi hộp được phân phối và hỗ trợ quy mô tuyến tính. Bạn cho nó dữ liệu qua JSON và truy vấn thông qua JSON.

Nó thực sự phụ thuộc vào nhu cầu và khả năng của bạn. Nhân sư có thể là cách dễ nhất để bắt đầu. Nhưng giới hạn chỉ số thời gian thực của nó có thể không hiệu quả với bạn.

+0

Sphinx và ElasticSearch có vẻ thú vị. Tôi sẽ nghiên cứu những giới hạn thời gian thực của nhân sư. Vậy lucene có lặp lại toàn bộ cơ sở dữ liệu mỗi lần không? nó không làm cập nhật gia tăng cho chỉ mục của nó? những gì về shinx và elasticsearch? – applechief

+0

1. ElasticSearch cũng dựa trên Lucene 2. Lucene có thể thêm tài liệu khi chúng mới xuất hiện để bạn KHÔNG phải reindex bất cứ điều gì, nhưng @Code có nghĩa là bạn sẽ cần phải nạp tài liệu và gọi hoạt động 'commit' tương đối đắt tiền để các tài liệu xuất hiện - điều này chỉ đúng với Solr. Lucene và như vậy ElasticSearch không cần tốn kém 'cam kết' 3. ElasticSearch là rất dễ dàng để bắt đầu quá ... – Karussell

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