2013-02-22 27 views
7

Tôi có biểu mẫu tìm kiếm tìm kiếm một bảng nội dung trang web để lấy lại kết quả phù hợp.Thứ tự MySQL theo mức độ liên quan

Tôi muốn tìm kiếm các trường tiêu đề và nội dung và kéo các kết quả theo thứ tự mức độ liên quan. Ưu tiên cao nhất cho tiêu đề.

Nói rằng chúng tôi đã có một bảng (tblContent) của

intID | strTitle | txtContent 

1  | Smith John | Lorem Ipsum 
2  | Lorem Ipsum | Lorem John Smith Ipsum 
3  | John Smith | Lorem Ipsum Lorem Ipsum 
4  | Lorem Ipsum | Lorem Ipsum Lorem Ipsum 
5  | Lorem Ipsum | Lorem Ipsum Smith John 

Và bạn đang tìm kiếm "John Smith" kết quả nên trở lại theo thứ tự 3,2,1,5

thế nào điều này có thể không?

+0

Bảng lớn bao nhiêu? – Achrome

+0

~ 150 hàng hiện tại. Đó là một trang web khá nhỏ vì vậy sẽ không bao giờ nhận được ngay cả hàng 1k – Fraser

+0

Xem điều đó, có thể nó có thể giúp: http://stackoverflow.com/a/35512410/1673161 –

Trả lời

16

tôi quản lý để có được khá tại chỗ trên với điều này:

SELECT *, 
((1.3 * (MATCH(strTitle) AGAINST ('+john+smith' IN BOOLEAN MODE))) + (0.6 * (MATCH(txtContent) AGAINST ('+john+smith' IN BOOLEAN MODE)))) AS relevance 
FROM content 
WHERE (MATCH(strTitle,txtContent) AGAINST ('+john+smith' IN BOOLEAN MODE)) 
ORDER BY relevance DESC 
+1

Sử dụng kết hợp tuyệt vời. – Achrome

+1

Tại sao, cảm ơn bạn :) – Fraser

+0

Whats sử dụng 0,6 ??? Xin vui lòng giới thiệu cho tôi nơi tôi có thể RTM. Cảm ơn – Karma

0

gì về điều gì đó dọc theo dòng của

SELECT INT(id), strTitle, txtContent 
FROM tblContent 
WHERE name like '%John%' 
GROUP BY strTitle 
ORDER BY CASE WHEN strTitle like 'John %' THEN 0 
      WHEN strTitle like 'John%' THEN 1 
      WHEN strTitle like '% John%' THEN 2 
      ELSE 3 
     END, strTitle 
+0

Vấn đề là tiêu chí tìm kiếm đến từ một người dùng dân cư tìm kiếm đầu vào để giải pháp chính xác cần để có thể xử lý bất cứ điều gì người dùng ném vào nó – Fraser

+0

Oh phải, dang không quá chắc chắn sau đó, xin lỗi! – Sim

4

Có lẽ là một cách hiệu quả hơn và đưa ra các chuỗi tìm kiếm có thể có nhiều hơn 2 từ này có lẽ là không khả thi, nhưng tôi muốn làm điều gì đó như

ORDER BY CASE 
WHEN strTitle LIKE '%John Smith%' THEN 1 
WHEN txtContent LIKE '%John Smith%' THEN 2 
WHEN strTitle LIKE '%Smith John%' THEN 3 
WHEN txtContent LIKE '%Smith John%' THEN 4 
ELSE 5 END 
+0

Tôi thích ý tưởng nhưng khi bạn đề cập đến tìm kiếm có thể là một số lượng không giới hạn các từ khi nó đến từ một đầu vào tìm kiếm – Fraser

+0

@Fraser bạn không bao giờ nên cung cấp cho người dùng một oportunity của bất cứ điều gì không giới hạn. Dù sao tôi không nhìn thấy vấn đề với truy vấn contatenate :) (bạn có thể sử dụng giữ chỗ động, năng động sanitize dữ liệu người dùng và truy vấn năng động nối :) –

+1

điều này sẽ dẫn đến một truy vấn hiệu suất rất thấp. – Amir

3

mysql toàn văn s earch là một điều tốt nhưng nó có giới hạn tối thiểu 4 ký tự từ được lập chỉ mục. Al khó khăn giới hạn có thể được thay đổi nhưng thay đổi các biến máy chủ là không thể trong tất cả các kịch bản. Trong trường hợp như vậy, tôi đề xuất giải pháp được đề xuất theo thứ tự theo trường hợp

select 
    * 
from 
mytable a 
WHERE 
    (a.title like 'somthing%' 
    OR a.title like '%somthing%' 
    OR a.title like 'somthing%') 
ORDER BY case 
WHEN a.title LIKE 'somthing%' THEN 1 
WHEN a.title LIKE '%somthing%' THEN 2 
WHEN a.title LIKE '%somthing' THEN 3 
ELSE 4 END; 
Các vấn đề liên quan