2013-03-19 58 views
5

Điều gì sẽ là cách hay để tìm kiếm một trường, bỏ qua dấu cách trong cụm từ tìm kiếm VÀ trường?MySQL - Tìm kiếm một trường bỏ qua dấu cách

Ví dụ:

SELECT * 
FROM tablename 
WHERE NOSPACES(fieldname) LIKE '%{search term with spaces removed}%' 

dụ thực thế giới:

Khách hàng của tôi có một trang web bán động cơ khối dài. Tuy nhiên, họ thường khiến mọi người tìm kiếm trên trang web của họ "cat 3306 longblock" (thay vì "khối dài 3306 con mèo"). Chúng ta cần các công cụ "chặn dài" để hiển thị khi tìm kiếm "longblock".

Lưu ý: nó có thể không quan trọng cho các mục đích của câu hỏi này, nhưng trang web này được xây dựng bằng cách sử dụng PHP 5.3 và phpActiverecord.

Trả lời

2

Bạn cũng có thể muốn xem xét Sphinx hoặc Lucene để xem toàn văn như tìm kiếm trên toàn văn của mysql. Tôi đã không sử dụng chúng cá nhân nhưng tôi nghe cả hai đều vượt trội so với mysql được xây dựng trong chỉ mục toàn văn.

Một điều cần lưu ý với tất cả các phương pháp này là chúng yêu cầu một chỉ mục đặc biệt để giữ cập nhật bổ sung thêm chi phí bảo trì và máy chủ.

Tốt bài viết về nhân sư: http://astellar.com/2011/12/replacing-mysql-full-text-search-with-sphinx/

Đối với một không có giải pháp bảo trì mà không tốt cho tên sản phẩm hoặc số là chỉ để chia thuật ngữ tìm kiếm của người dùng bằng dấu cách và thêm LIKE '% term%' cho mỗi truy vấn của bạn .

Ngoài ra, tôi tạo trường tìm kiếm đặc biệt là tên hoặc số sản phẩm có mã thông báo được sắp xếp theo thứ tự bảng chữ cái và dấu cách và ký hiệu bị tước. Bạn cần cập nhật trường này mỗi khi tên sản phẩm thay đổi. Sau đó, ngoài các truy vấn đối với trường gốc I OR tìm kiếm dựa vào trường bị tước mới này. Ví dụ: nếu bạn có tên sản phẩm như 'longblock dài 3306' thì hãy tạo trường product_name_search và đặt '3306catlongblock'. Khi người dùng tìm kiếm 3306 long-block Bạn xử lý việc tìm kiếm bằng cách tách các biểu tượng và tách trên không gian:

WHERE (other product name search clauses) OR 
    (product_name_search LIKE '%3306%' AND product_name_search LIKE '%longblock%') 

Quá trình này là không tốt như FREETEXT nhưng nó khá tốt cho tên sản phẩm và số.

+0

Xin cảm ơn, Tim. Trường tìm kiếm đặc biệt có thể hoạt động.Vấn đề lớn nhất là chúng tôi đang tìm kiếm "3306 longblock" khi sản phẩm có tên "Cat 3306 Long Block". Lưu ý việc thiếu không gian trong cụm từ tìm kiếm. –

+1

bạn sẽ cần phải tách tìm kiếm '3306 longblock' thành ... LIKE '% 3306%' AND ... LIKE '% longblock%' đối với trường product_name_search đã xử lý –

+0

Điều này đã hiệu quả, cảm ơn Tim. –

3

Tôi khuyên bạn nên có một số phương pháp tiếp cận, tùy thuộc vào mức độ đơn giản mà bạn muốn thực hiện. Cá nhân tôi sẽ sử dụng Full-Text Search sử dụng các nguyên tắc đặt ra ở đây http://dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html

Nhưng bạn cũng có thể dải không gian ra khỏi thuật ngữ tìm kiếm sử dụng một biểu thức chính quy tức là

$str=preg_replace('/\s+/', '', $str); 
+0

Cảm ơn câu trả lời. Các khoảng trống không có trong thuật ngữ tìm kiếm. Họ đang ở trong lĩnh vực chúng tôi đang tìm kiếm. Chúng tôi đang tìm kiếm "longblock" và trường có chứa "block dài". –

+0

trong trường hợp đó tìm kiếm văn bản đầy đủ sẽ giúp bạn ra ngoài ... – diagonalbatman

+0

Gotcha. Sẽ kiểm tra nó ra ... cảm ơn! –

0

Có cách sử dụng chức năng lặp lại. Ví dụ:

SELECT * FROM `products` where REPLACE(PartName, ' ', '') = REPLACE('0 1 3000 70 27', ' ', '') 
Các vấn đề liên quan