Sắp xếp theo trận đấu của THÍCH


8

Tôi tự hỏi làm thế nào tôi có thể triển khai SQL để có được kết quả được sắp xếp theo kết hợp tốt nhất của một vị từ giống như. Tôi có 100K bài viết trong cơ sở dữ liệu và khi người dùng gọi một số mục theo tên. Tôi muốn hiển thị các kết quả được sắp xếp theo kết quả phù hợp nhất của truy vấn được hỏi.

Tôi sẽ cố gắng mô tả điều đó bằng mã giả

select 
*
from
articles
where item_nale like '%'+@user_input +'%'
order by "BEST MATCH"

Câu trả lời:


11

Không thể tính toán mức độ phù hợp với vị từ THÍCH. Đối với SQL Server (mà từ các câu hỏi trước tôi tin là nền tảng của bạn?) Bạn sẽ muốn xem xét tìm kiếm toàn văn bản có hỗ trợ cho điểm / xếp hạng kết quả theo mức độ liên quan.


21

Vì tất cả các kết quả khớp của bạn phải khớp với mẫu THÍCH để được đưa vào, nên điều đơn giản cần làm là giả sử rằng các giá trị ngắn hơn cho cột bạn khớp là khớp "tốt hơn", vì chúng gần với giá trị chính xác của mẫu.

ORDER BY LEN(item_nale) ASC

Ngoài ra, bạn có thể giả sử rằng các giá trị trong đó mẫu khớp xuất hiện sớm hơn là khớp "tốt hơn".

ORDER BY PATINDEX('%' + @user_input + '%', item_nale) ASC

Hoặc bạn có thể kết hợp cả hai; tìm kiếm các trận đấu sớm nhất trước và trong các trận đấu đó, thích các giá trị ngắn hơn.

ORDER BY PATINDEX('%' + @user_input + '%', item_nale) ASC, LEN(item_nale) ASC

Nó không phức tạp như những gì lập chỉ mục toàn văn bản và nó chỉ chiếm sự phù hợp trên một cột duy nhất, nhưng nó cho kết quả đủ tốt.


Bạn cũng có thể cân các hàng nơi biểu thức tìm kiếm xuất hiện cao hơn nhiều lần.
Martin Smith

3

Tạo hàm Levenshtein và sắp xếp theo trường này.

Tham chiếu: https://www.red-gate.com/simple-talk/bloss/opes-comparisons-in-sql-edit-distance-and-the-levenshtein-alerskym/

Nếu bạn có chức năng này, nó có thể là:

select 
   field1,
   field2,
   field3,
   fieldN,
   item_nale,
   MyLevenshteinFunction(item_nale,@user_input) LevenshteinDistance
from (
    select 
       field1,
       field2,
       field3,
       fieldN,
       item_nale,
       LevenshteinDistance
    from
    articles
    where item_nale like '%'+@user_input +'%'
) as result
order by LevenshteinDistance DESC

Chào mừng bạn đến với DBA SE! Lưu ý, bài viết của bạn trông tốt hơn nếu tất cả chúng đều bằng tiếng Anh. Vì vậy, mọi người đều có thể đọc chúng, không chỉ người nói tiếng Tây Ban Nha.
peterh - Phục hồi Monica
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.