2009-02-02 51 views
22

Chúng tôi đã OCRed hàng nghìn trang bài báo. Các tờ báo, vấn đề, ngày tháng, số trang và văn bản OCRed của mỗi trang đã được đưa vào cơ sở dữ liệu mySQL.Công cụ tìm kiếm giống như Google trong PHP/mySQL

Bây giờ chúng tôi muốn xây dựng một công cụ tìm kiếm giống như Google trong PHP để tìm các trang được cung cấp truy vấn. Nó phải nhanh và mất không quá một giây cho bất kỳ tìm kiếm nào.

Chúng ta nên làm như thế nào?

+3

Điều gì làm cho Google khác với công cụ tìm kiếm văn bản thuần túy là nó nghiên cứu mối quan hệ giữa các trang. Bạn sẽ liên kết các trang của mình với nhau như thế nào? Liên kết? Từ/cụm từ khóa? Nếu bạn không có bất kỳ mối quan hệ nào, bạn nên sử dụng tìm kiếm văn bản tốt hơn. –

+1

Cơ sở dữ liệu của chúng tôi 50.000 mặt hàng mất mySQL khoảng 20 giây để thực hiện tìm kiếm văn bản thuần túy. Các trang báo của OCRed của chúng tôi là một tập dữ liệu lớn hơn nhiều. Chúng tôi cần các phương pháp lập chỉ mục và truy xuất nhanh hơn giống như Google để tìm kiếm báo chí của chúng tôi trong chưa đầy một giây. – lkessler

+0

công cụ tìm kiếm không sử dụng cơ sở dữ liệu sql khi chúng làm cho tìm kiếm chậm. Bạn có thể sử dụng Lucene hoặc mã công cụ tìm kiếm của riêng bạn. php không phải là ngôn ngữ phù hợp để phát triển công cụ tìm kiếm. – alienCoder

Trả lời

14

Bạn cũng có thể dùng thử SphinxSearch. Craigslist sử dụng nhân sư và nó có thể kết nối với cả mysql và postgresql.

+0

Xin chào, tôi đã tạo nhiều trang web, tôi muốn tìm kiếm bất kỳ từ nào trong các trang của mình .. vì vậy, tất cả các bạn đều hữu ích cho tôi? thanks – pcs

+0

Không biết Craigslist sử dụng Sphinx –

10

Có một số công cụ tìm kiếm thú vị để bạn có thể có một cái nhìn tại. Tôi không biết ý bạn là "Google thích" vì vậy tôi sẽ bỏ qua phần đó.

  • Hãy xem động cơ Lucene. Bản gốc có hiệu suất cao nhưng được viết bằng Java. Có một port of Lucene to PHP (đã được đề cập ở nơi khác) nhưng nó quá chậm.
  • Hãy xem xét kỹ lưỡng số Xapian Project. Nhanh quá. Nó được viết bằng C++, do đó bạn có thể sẽ phải xây dựng nó cho (các) máy chủ đích của bạn nhưng có các ràng buộc PHP.
2

Kịch bản của bạn đề xuất, bạn muốn tự cuộn; điểm khởi đầu tốt đẹp cho một công cụ tìm kiếm chung sẽ bao gồm:

Nếu bạn muốn sử dụng một giải pháp off-shelf:

  • Nếu ứng dụng của bạn là dựa trên web, và có sẵn cho Internet công cộng, bạn thực sự phải đưa ra một lý do rất tốt để không đi với Google Site Search
  • Lucene has a port for PHP
+0

Rất tiếc. Tại sao viết của riêng bạn? Tôi thực sự không nhìn thấy những gì về tình hình của OP làm cho nó đáng giá để tái thực hiện những gì gần đây đã trở thành một tính năng hàng hóa. –

+2

OP cho biết "Bây giờ chúng tôi muốn xây dựng" – Artelius

1

Bạn có thể muốn kiểm tra Sphider. Theo kinh nghiệm của tôi, nó khá nhanh và tự động lập chỉ mục. Nó cũng là nguồn mở để bạn có thể lấy mã và sửa đổi nó cho nhu cầu của bạn.

2

Tại sao bạn không dùng thử Google Search Appliance hoặc Google Enterprise? Nó sẽ có chi phí liên quan nhưng sau đó nó sẽ giúp bạn tiết kiệm từ tái phát minh ra bánh xe và cung cấp cho bạn "google như" tìm kiếm.

+0

Chúng tôi muốn gắn bó với PHP và mySQL vì cơ sở dữ liệu có mục đích chéo và cần được tích hợp với phần còn lại của trang web của chúng tôi. – lkessler

10

Nếu tìm kiếm toàn văn của MySQL mất 20 giây cho mỗi truy vấn, bạn đã định cấu hình sai hoặc chạy trên phần cứng không đủ mạnh - một số trang lớn đang sử dụng thành công tìm kiếm MyISAM cũ.

Bỏ phiếu của tôi đi theo số Solr, tuy nhiên. Nó dựa trên Lucene, vì vậy bạn có được tất cả sự phong phú và hiệu quả của sản phẩm tốt nhất của sản phẩm giống, nhưng với một API RESTful, làm cho nó rất dễ dàng from PHP. Thậm chí còn có dW article.

+1

Tôi đồng ý. Đi với SOLR tất cả các cách. Tích hợp PHP và SOLR nhiều lần và nó xứng đáng với thời gian. –

+0

Có 20 giây để tìm kiếm toàn văn bản MySQL cho biết có điều gì đó bị hỏng. Phải mất khoảng 0,01 đến 0,05 giây SQL + trang hiển thị tổng thời gian cho toàn văn trên> 250.000 hàng ngay cả trên hệ thống đầu cuối rất thấp (lõi đơn, 512 MB ram) - thậm chí thực hiện nhiều câu lệnh LIKE cho mỗi từ khóa trên DB với 250.000 không nên mất nhiều hơn một giây. Có vẻ như hầu hết các cột đều không được lập chỉ mục. Đối với <250,00 hàng lặp lại trên tất cả các kết quả phù hợp trong PHP để xếp hạng chúng một cách thông minh thì vẫn nên là phụ thứ hai. –

+0

Xin chào, tôi đã tạo rất nhiều trang web, tôi muốn tìm kiếm bất kỳ từ nào trong các trang của tôi .. vì vậy, tất cả các bạn đều hữu ích cho tôi? cảm ơn – pcs

4

Bạn có thể đặt tất cả các tệp trên Google Documents, sau đó loại bỏ kết quả vào trang web của riêng bạn.

Quan tâm của tôi là độ chính xác OCR vẫn là một vấn đề, do đó, một xem xét cho yêu cầu tìm kiếm là khả năng thực hiện tìm kiếm "mờ". Ý nghĩa mờ ảo khi OCR nhận ra không chính xác từ "mũ" cho "nóng", công cụ tìm kiếm sẽ đủ thông minh để trả lại kết quả tương tự nhưng không chính xác. Trong Oracle, có một hàm gọi là UTL_MATCH so sánh sự giống nhau giữa hai chuỗi: http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/u_match.htm#ARPLS352

Một chức năng như thế này sẽ hữu ích.

0

sqlite có khá tốt toàn văn khả năng tìm kiếm (nhìn lên FTS sqlite 3/4 - nó ngạc nhiên tốt)

nếu bạn muốn đơn giản một PHP Tự làm phương pháp lập chỉ mục sử dụng tối đa của rất nhiều tập tin nhỏ chia bởi một hash của các thuật ngữ được lập chỉ mục có thể làm việc rất tốt amd tìm kiếm có thể rất nhanh ngay cả trong php nếu bạn chăm sóc thiết kế nó. (ý tưởng là thực hiện tìm kiếm trên thuật ngữ chỉ cần tìm kiếm một tệp rất nhỏ chứa các cụm từ phù hợp với mã băm và bản ghi - bạn có thể sử dụng lát bitarray để đại diện cho id bản ghi nếu bạn muốn tiết kiệm không gian HD) .. việc lập chỉ mục của mỗi từ cho toàn văn sẽ chậm trong php .. phần đó thực sự phải được thực hiện trong c

cho tìm kiếm "mờ" có thể xem bằng cách sử dụng băm metaphone.

cho các công cụ toàn văn được xây dựng trước kiểm tra sau đây: FTS sqlite 3/4 (! Sqlite có khả năng tìm kiếm rất tốt toàn văn), Sphinx, kinoSearch (kinoSearch là một chút như Lucene nhưng back-end là c với một wrapper perl dễ dàng tốt đẹp - đó cũng là cLucene nhưng tôi nghĩ rằng đó vẫn còn pre-alpha)

Java Lucene (hoặc bất kỳ Java dựa) có thể cần rất nhiều ram để được đặt sang một bên để chạy một JVM - vì vậy có lẽ không tuyệt vời như vậy nếu bạn đang sử dụng ngân sách

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