Tạo ba chỉ mục văn bản đầy đủ
- a) một trên cột từ khóa
- b) một trên cột nội dung
- c) một trên cả cột từ khóa và nội dung
Sau đó, truy vấn của bạn:
SELECT id, keyword, content,
MATCH (keyword) AGAINST ('watermelon') AS rel1,
MATCH (content) AGAINST ('watermelon') AS rel2
FROM table
WHERE MATCH (keyword,content) AGAINST ('watermelon')
ORDER BY (rel1*1.5)+(rel2) DESC
Vấn đề là rel1
cung cấp cho bạn mức độ liên quan của truy vấn của bạn chỉ trong keyword
(vì bạn chỉ tạo chỉ mục trên cột đó). rel2
làm tương tự, nhưng đối với content
cột. Giờ đây, bạn có thể cộng hai điểm mức độ phù hợp này với nhau bằng cách áp dụng bất kỳ trọng số nào bạn muốn.
Tuy nhiên, bạn không sử dụng một trong hai chỉ mục này cho tìm kiếm thực tế. Đối với điều đó, bạn sử dụng chỉ mục thứ ba của mình, nằm trên cả hai cột.
Chỉ mục trên (từ khóa, nội dung) kiểm soát việc thu hồi của bạn. Aka, những gì được trả lại.
Hai chỉ mục riêng biệt (một chỉ trên từ khóa, một chỉ trên nội dung) kiểm soát mức độ liên quan của bạn. Và bạn có thể áp dụng tiêu chí trọng số của riêng mình tại đây.
Lưu ý rằng bạn có thể sử dụng bất kỳ số lượng chỉ mục nào khác nhau (hoặc, thay đổi các chỉ mục và trọng số mà bạn sử dụng tại thời điểm truy vấn dựa trên các yếu tố khác, có thể là ... chỉ tìm kiếm trên từ khóa nếu truy vấn có chứa từ dừng ... giảm thiên vị trọng số cho từ khóa nếu truy vấn chứa nhiều hơn 3 từ ... vv).
Mỗi chỉ mục sử dụng hết dung lượng đĩa, do đó, nhiều chỉ mục hơn, nhiều đĩa hơn. Và đến lượt nó, dấu chân bộ nhớ cao hơn cho mysql. Ngoài ra, quá trình chèn sẽ mất nhiều thời gian hơn vì bạn có nhiều chỉ mục hơn để cập nhật.
Bạn nên chuẩn hiệu suất (cẩn thận tắt bộ đệm truy vấn mysql để đo điểm chuẩn nếu không kết quả của bạn sẽ bị sai lệch) cho trường hợp của bạn. Đây không phải là loại google hiệu quả, nhưng nó khá dễ dàng và "tiện lợi" và nó gần như chắc chắn tốt hơn rất nhiều so với việc bạn sử dụng "like" trong các truy vấn.
Tôi thấy nó hoạt động rất tốt.