2009-12-16 34 views
5

Tôi đang tìm cách triển khai tìm kiếm mờ cho một ứng dụng PHP/MySQL nhỏ. Cụ thể, tôi có một cơ sở dữ liệu với khoảng 2400 hồ sơ (hồ sơ được thêm vào với tốc độ khoảng 600 mỗi năm, do đó, nó là một cơ sở dữ liệu nhỏ). Ba lĩnh vực quan tâm là địa chỉ đường phố, họ và ngày tháng. Tôi muốn có thể tìm kiếm theo một trong các trường đó và về cơ bản có khả năng chịu lỗi chính tả/lỗi ký tự. ví dụ: địa chỉ của "123 Main Street" cũng phải khớp với "123 Main St", "123 Main St.", "123 Mian St", "123 Man St", "132 Main St", v.v. và tương tự như vậy đối với tên và ngày tháng.PHP/MySQL tìm kiếm mờ quy mô nhỏ

Những vấn đề chính tôi có câu trả lời cho câu hỏi tương tự khác:

  • Đó là không thể xác định từ đồng nghĩa cho mỗi chính tả không chính xác càng tốt, quên làm như vậy cho những ngày và tên.
  • Lucene, v.v ... có vẻ rất nặng đối với tập dữ liệu tìm kiếm giới hạn như vậy (gọi tối đa 5.000 bản ghi, 3 trường cho mỗi bản ghi).
  • Chỉ cần làm điều gì đó với ký tự đại diện dường như không hợp lý với tất cả các lỗi chính tả có thể xảy ra.

Mọi đề xuất? Tôi biết nó sẽ không thể thực hiện được với MySQL, nhưng vì tập dữ liệu quá giới hạn, tôi muốn giữ nó tương đối đơn giản ... có lẽ là một lớp PHP có được tất cả của các bản ghi từ DB, sử dụng một số loại thuật toán so sánh, và trả về các ID của các bản ghi tương tự?

Cảm ơn, Jason

Trả lời

7

Câu trả lời của Razzie (hoặc sử dụng Damerau–Levenshtein) xếp hạng danh sách các ứng viên phù hợp theo sự gần gũi của chúng với khóa tìm kiếm. (Hãy cẩn thận: nếu khóa là "12 Main St" thì "13 Main St" có cùng khoảng cách nhập là "12 Moin St" nhưng bạn có thể muốn xếp hạng thấp hoặc thậm chí loại trừ nó, như với 11 và 22 Main St vv)

Nhưng làm cách nào để bạn chọn danh sách các ứng viên có kích thước có thể quản lý để xếp hạng?

Một cách là tính toán giá trị metaphone (hoặc các giá trị, sử dụng metaphone kép) cho mỗi từ trong chuỗi mà bạn sẽ tìm kiếm. Lưu từng metaphones trong một bảng khác với id của hàng chứa chuỗi gốc. Sau đó bạn có thể tìm kiếm các giá trị metaphone này một cách nhanh chóng với LIKE 'key%' trong đó khóa là metaphone của một từ trong văn bản tìm kiếm.

Kiểm tra câu trả lời được đề xuất trên this thread. Nó khá gọn gàng và hoạt động tốt cho các DB không lớn.

3

Nếu nó là một cơ sở dữ liệu rất nhỏ, bạn có thể tải tất cả các dữ liệu cùng một lúc và sử dụng một thuật toán như Jaro-Winkler cho tìm kiếm của bạn. Họ có một thực hiện trong PHP, mà bạn có thể tìm thấy here.

Imho hoạt động thực sự tốt. Hãy xem xét triển khai ví dụ here. Tôi biết rằng tìm kiếm đó sử dụng cùng một thuật toán, và nó có thể tìm thấy 'Nintedno' rất tốt. Nó cũng sắp xếp kết quả cho bạn, dựa trên kết quả nào phù hợp nhất với truy vấn của bạn.

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