2008-12-05 28 views
8

Tôi biết cách thực hiện tìm kiếm mysql php thường xuyên và hiển thị kết quả. Tuy nhiên, vì bản chất của những gì tôi đang cố gắng hoàn thành, tôi cần có khả năng sắp xếp theo mức độ liên quan. Hãy để tôi giải thích điều này tốt hơn:Tìm kiếm MySQL PHP và đặt hàng theo mức độ liên quan

Truy vấn bình thường "ứng dụng iphone táo" sẽ tìm kiếm cơ sở dữ liệu bằng% ứng dụng iphone apple%, nhưng nếu không có hồ sơ hiển thị cụm từ đó theo thứ tự chính xác thì tìm kiếm sẽ không tạo ra gì. Những gì tôi về cơ bản cần làm là tìm kiếm 'táo', 'iphone' và 'ứng dụng' tất cả một cách riêng biệt và sau đó hợp nhất các kết quả thành một, và sau đó tôi cần phải đánh giá mức độ liên quan của bao nhiêu trường hợp của từ đó được tìm thấy trong hồ sơ. Ví dụ nếu tôi đã làm những gì tôi muốn làm và nó trở lại chúng sau:

Iphone Applications From Apple 
Apple Make The Best Apple Iphone Applications 
Iphone Applications 

Họ sẽ xếp hạng như sau:

Apple Make The Best Apple Iphone Applications 
Iphone Applications From Apple 
Iphone Applications 

Bởi vì có bao nhiêu trường hợp của thuật ngữ tìm kiếm được tìm thấy. Xem được đánh dấu:

[Apple] Make The Best [Apple] [Iphone] [Applications] 
[Iphone] [Applications] From [Apple] 
[Iphone] [Applications] 

Tôi hy vọng tôi đã giải thích điều này đủ và tôi sẽ rất biết ơn nếu có ai có thể cho tôi bất kỳ gợi ý nào.

Trả lời

6

hãy nhìn vào các MySQL FULLTEXT search functions, Những sẽ tự động trả về kết quả bởi tính thích hợp, và cung cấp cho bạn kiểm soát nhiều hơn so với tìm kiếm của bạn

duy nhất vấn đề tiềm năng với việc sử dụng các chỉ số toàn văn là chúng không được hỗ trợ bởi các bảng InnoDB.

+2

Tôi biết điều này là cũ, nhưng nếu ai đó tình cờ về điều này. chúng được hỗ trợ ngay bây giờ bởi innoDB –

5

Một google nhanh đã cho tôi this link.

Ví dụ:

select title, match (title,content) against (”internet”) as score 
from cont 
where match (title,content) against (”internet”) limit 10; 
0
SELECT field2, field3, ..., MATCH(field1, field2) AGAINST ("search string") AS relevance WHERE MATCH(field1, field2) AGAINST "search string" ORDER BY relevance DESC LIMIT 0,10 

Trong tập kết quả, sẽ có trường "mức độ liên quan", được sử dụng ở đây để sắp xếp kết quả.

1

Có lẽ điều này có thể giúp một người nào đó (thứ tự theo sự phù hợp và giữ số lượng từ):

None toàn văn:

SELECT *, ((value_column LIKE '%rusten%') + (value_column LIKE '%dagen%') + (value_column LIKE '%bezoek%') + (value_column LIKE '%moeten%')) as count_words 
FROM data_table 
WHERE (value_column LIKE '%dagen%' OR value_column LIKE '%rusten%' OR value_column LIKE '%bezoek%' OR value_column LIKE '%moeten%') 
ORDER BY count_words DESC 

Full-text:

SELECT * FROM data_table 
WHERE MATCH(value_column) AGAINST('+dagen +rusten +bezoek +moeten' IN BOOLEAN MODE) 
ORDER BY MATCH(value_column) AGAINST('+dagen +rusten +bezoek +moeten' IN BOOLEAN MODE) DESC; 
+1

Điều này làm việc cho tôi. Tôi muốn kết quả được sắp xếp theo mức độ liên quan nhưng tôi cũng muốn một phần phù hợp được trả lại, toàn văn không hỗ trợ. – cmann

0

tôi Đừng Chính xác những gì bạn muốn nhưng mã sau chắc chắn làm việc cho bạn.

SELECT ("some text here" or `column_name`) RLIKE "Apple|Iphone|Application" AS Result ORDER BY Result DESC; 

Phân tách tất cả các từ bằng Bar (|) nhưng kết quả sẽ là 1 hoặc 0 thành lập hoặc không được tôn trọng. Nếu bạn muốn nhận các hàng được thành lập, hãy xem bên dưới.

SELECT * FROM "table_name" WHERE `column_name` RLIKE "Apple|Iphone|Application"; 
Các vấn đề liên quan