Sortieren nach Match von LIKE


8

Ich frage mich, wie ich SQL implementieren kann, um die Ergebnisse nach der besten Übereinstimmung eines ähnlichen Prädikats zu sortieren. Ich habe 100.000 Artikel in der Datenbank und wenn Benutzer einige Artikel nach einem Teil des Namens aufrufen. Ich möchte die Ergebnisse anzeigen, die nach der besten Übereinstimmung der gestellten Abfrage geordnet sind.

Ich werde versuchen, das durch Pseudocode zu beschreiben

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

Antworten:


11

Es ist nicht möglich, die Relevanz mit dem LIKE-Prädikat zu berechnen. Für SQL Server (aus früheren Fragen, von denen ich glaube, dass es Ihre Plattform ist?) Sollten Sie sich die Volltextsuche ansehen, die das Bewerten / Rangieren von Ergebnissen nach Relevanz unterstützt.


21

Da alle Ihre Übereinstimmungen mit dem LIKE-Muster übereinstimmen müssen , um eingeschlossen zu werden, können Sie einfach davon ausgehen, dass kürzere Werte für die Spalte, mit der Sie übereinstimmen, "bessere" Übereinstimmungen sind, da sie näher am exakten Wert von liegen Muster.

ORDER BY LEN(item_nale) ASC

Alternativ können Sie davon ausgehen, dass Werte, in denen das Übereinstimmungsmuster früher angezeigt wird, "bessere" Übereinstimmungen sind.

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

Oder Sie könnten die beiden kombinieren; Suchen Sie zuerst nach frühesten Übereinstimmungen und bevorzugen Sie innerhalb dieser kürzere Werte.

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

Es ist nicht so ausgefeilt wie die Volltextindizierung und berücksichtigt nur Übereinstimmungen in einer einzelnen Spalte, liefert jedoch ausreichend gute Ergebnisse.


Sie können auch Zeilen wiegen, in denen der Suchausdruck um ein Vielfaches höher angezeigt wird.
Martin Smith

3

Generieren Sie die Levenshtein-Funktion und ordnen Sie nach diesem Feld.

Ref: https://www.red-gate.com/simple-talk/blogs/string-comparisons-in-sql-edit-distance-and-the-levenshtein-algorithm/

Wenn Sie diese Funktion haben, könnte es sein:

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

Willkommen auf der DBA SE! Beachten Sie, dass Ihre Beiträge besser aussehen, wenn alle auf Englisch sind. So kann jeder sie lesen, nicht nur spanischsprachige.
Peter - Wiedereinstellung Monica
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.