2011-10-29 23 views
6

Tôi có khách hàng hỏi xem họ có tìm kiếm tên công ty có thể được tìm kiếm ở một số định dạng tùy thuộc vào đầu vào của người dùng hay không, chẳng hạn như công ty được lưu trữ trong cơ sở dữ liệu là AJR Kelly Ltd, nếu người dùng tìm kiếm "AJR Kelly" nó được tìm thấy, sử dụng;MySQL LIKE% string% không hoàn toàn tha thứ đủ. Bất cứ điều gì khác tôi có thể sử dụng?

<cfif pctermsCount gt 0> 
AND (LOWER(p.name) LIKE '%#pcTerms#%') 
</cfif> 

Nếu họ tìm kiếm "Kelly" công ty được tìm thấy, nhưng nếu họ tìm kiếm phiên bản bị hỏng của chuỗi như "A J Kelly" hoặc "AJ Kelly" thì không tìm thấy.

Có điều gì tôi có thể làm để làm cho nó dễ chịu hơn một chút không?

Cảm ơn.

Trả lời

8

Nếu bạn đang sử dụng MyISAM, bạn có thể sử dụng lập chỉ mục toàn văn. See this tutorial

Nếu bạn đang sử dụng một công cụ lưu trữ khác nhau, bạn có thể sử dụng một bên động cơ toàn văn thứ ba như nhân sư, có thể hoạt động như một storage engine for mysql hoặc một máy chủ riêng biệt mà có thể được truy vấn.

Với chỉ mục toàn văn MySQL tìm kiếm trên A J Kelly sẽ khớp với AJ Kelly (không gây nhầm lẫn vấn đề nhưng A, J và AJ sẽ bị bỏ qua vì chúng quá ngắn theo mặc định và sẽ khớp với Kelly.) Nói chung Fulltext là nhiều hơn tha thứ (và thường nhanh hơn LIKE '% string%') bởi vì cho phép một phần các trận đấu mà sau đó có thể được xếp hạng theo mức độ liên quan.

Bạn cũng có thể sử dụng SOUNDEX để làm cho tìm kiếm được tha thứ hơn bằng cách lập chỉ mục các từ tương đương ngữ âm và tìm kiếm chúng bằng cách áp dụng SOUNDEX trên cụm từ tìm kiếm của bạn và sau đó sử dụng chúng để tìm kiếm chỉ mục. Với soundex mary, mariemarry tất cả sẽ khớp nhau, chẳng hạn.

+0

Chúng tôi đang sử dụng MyISAM. Tôi đã xem xét FullText vì vậy tôi đã thử nghiệm để đảm bảo rằng tôi có thể kích hoạt nó trên bàn, nó có thể.Tôi đã không thử nó, bởi vì nó có nghĩa là khá nhiều fiddling để cung cấp cho nó một đi trên giao diện người dùng, nhưng tôi sẽ hiển thị một vài ví dụ cho khách hàng trong PHPMyAdmin, nhưng tôi đã có một cảm giác FullText có thể là một chút quá tha thứ cho ý thích của mình. Cảm ơn câu trả lời của bạn. Fulltext có vẻ là giải pháp tốt nhất nếu anh ta không thể sống với vấn đề này. –

+0

Bạn không cần phải lo lắng về giao diện người dùng. Bạn có thể lấy chuỗi tìm kiếm tương tự và thay đổi WHERE thành một cái gì đó như 'nơi MATCH (indexcol) chống lại ('AJ Kelly' trong Boolean Mode) ORDER BY MATCH (indexcol) chống lại ('AJ Kelly' trong Boolean Mode) DESC' –

+0

Yeah , xin lỗi, tôi không rõ. Bởi "giao diện người dùng" tôi có nghĩa là mã phụ trợ của trang web, có khá nhiều truy vấn xây dựng dựa trên rất nhiều nội dung đến từ nhiều địa điểm, nó khá quá phức tạp, vì vậy sẽ dễ dàng hơn nếu kiểm tra kết quả từ toàn văn bằng cách hiển thị anh ấy trong PHPMyAdmin hơn là thực hiện nhiều thay đổi đối với mã phụ trợ để dùng thử. Xin lỗi, nhưng cảm ơn bạn đã đăng đoạn trích truy vấn đó, đã tiết kiệm cho tôi nhiều thời gian hơn. : D –

1

Tricky, tôi giả sử một phương pháp đơn giản là xóa khoảng trắng trên tìm kiếm thuật ngữ cơ sở dữ liệu, vì vậy AJRKelly được sử dụng thay vì A J R Kelly. Sau đó, sử dụng khoảng trắng làm người seperator cho các cụm từ tìm kiếm riêng lẻ. Bằng cách đó A J Kelly sẽ tìm kiếm A, J và Kelly một cách riêng biệt. AJ Kelly sẽ tìm kiếm AJ và Kelly một cách riêng biệt. Chúng sẽ khớp với cụm từ cơ sở dữ liệu đã loại bỏ khoảng trắng AJRKelly.

+0

Điều này thực sự chỉ bao gồm trường hợp sử dụng hẹp, chỉ cho phép khớp chính xác và sẽ khó triển khai hiệu quả. Hoặc sẽ có hai cột cho mỗi cột để tìm kiếm (một với, một không có dấu cách) hoặc khoảng trống sẽ bị loại bỏ trước khi thực hiện như thế (sẽ rất tốn kém) –

2

Bạn có thể tạo cột mới và đặt làm phiên bản có thể tìm kiếm tên bằng cách xóa khoảng trắng, sau đó đặt kiểu dữ liệu cột là FULLTEXT (sẽ chỉ hoạt động với MyISAM). Bạn có thể muốn xem xét Lucene/SOLR. SOLR cung cấp một số mã thông báo hoạt động rất tốt trong loại tình huống này. Đường cong học tập khá cao, nhưng đáng giá trong thời gian dài.

4

Nếu bạn thực sự đang chạy ColdFusion, bạn có quyền truy cập vào chỉ mục văn bản đầy đủ của CF bằng cách sử dụng Verity hoặc Solr/Lucene. Một trong số đó sẽ cung cấp cho bạn khả năng "phù hợp mờ" tốt cho chuỗi.

Việc sử dụng bảng MyISAM là một loại thuốc đắng chỉ để lập chỉ mục toàn văn - bạn từ bỏ rất nhiều sự an tâm, và những thứ như ràng buộc khóa ngoại.

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