Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm cách nào để tôi có thể thao túng mức độ liên quan của tìm kiếm toàn văn bản trong MySQL để làm cho một trường trở nên 'có giá trị' hơn trường khác?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Xóa các hàng sql trong đó ID không khớp với bảng khác

  2. Giải thích về khung khả dụng cao của MySQL - Phần I:Giới thiệu

  3. Lỗi nghiêm trọng:Không có ngoại lệ 'mysqli_sql_exception' với thông báo 'Không có chỉ mục nào được sử dụng trong truy vấn / câu lệnh chuẩn bị'

  4. LỖI:Tính năng tải dữ liệu cục bộ bị tắt - tính năng này phải được bật ở cả phía máy khách và máy chủ

  5. Cách giới hạn hàng trong tập kết quả MySQL