Wie man eine sql-Suchabfrage mehr mächtig?
Schrieb ich diese sql-Abfrage zur Suche in einer Tabelle:
SELECT * FROM TableName WHERE Name LIKE '%spa%'
Der Tabelle enthalten diese Zeile zum Beispiel:
- Space Company.
- Spa resort.
- Spa hotel.
- Ersatzteile.
- WithoutTheKeyword.
Möchte ich wissen, wie Bearbeiten Sie diese Abfrage, damit Sie wieder die Ergebnisse sortiert so:
2 Spa-resort
3 Spa hotel
1 Space Company
4 Ersatzteile
Bedeutet, die Elemente enthalten, die das genaue Wort zuerst, dann die so.
Du musst angemeldet sein, um einen Kommentar abzugeben.
etwas wie
funktionieren sollte ok.
eigentlich besser funktionieren wird
FWIW ich habe ein paar schnelle tests und wenn 'Name' ist in einem nicht GRUPPIERTEN INDEX in SQL verwenden Sie die index-und nicht ein table-scan. Auch, WIE scheint die Verwendung weniger Ressourcen als bei charindex (das gibt weniger wünschenswert Ergebnisse). Getestet auf sql 2000.
Merkt man, vermute ich, dass das schema nur über entfällt jegliche Nützlichkeit von Indizes für diese Art von Fragen?
Ein großes problem ist Ihre "LIKE '%spa -%'". Jeder "LIKE" Taste, beginnend mit einer wildcard ist ein automatisches Scannen der Tabelle.
EDIT:
Ich lese deine Frage zu sagen, dass es ein einzelnes Feld, Name, Feld-Werte, so etwas wie "1-Raum-Gesellschaft", "2 Spa-resort", etc. mit einer Zahl, gefolgt von Worten. Und man brauchte das wild-card vor Ihren Suchbegriff, um vorbei an der Zahl Teil. (Dies ist zu klären, in meinem ersten Kommentar.) Bin ich richtig erraten oder nicht?
Sollte Folgendes tun, die notwendig, aber es ist ineffizient, zwei vollständige Tabelle auswählt und es stützt sich auch auf Ihre exakte übereinstimmung wird durch ein Leerzeichen voneinander getrennt. Ich denke, Volltext-Indizierung helfen würde, aber das hat die Gemeinkosten des eigenen.
Geht aus der top-Beispiel, zumindest in MSSQL2005 ändern Sie den GRUPPIERTEN NONCLUSTERED verwendet wird es machen Sie einen Tabellen-scan. GRUPPIERTE bietet Ihnen eine index-Suche. Wie es aussieht, entspricht den Bedingungen der Frage.
Benötigen Sie grundsätzlich, um zu definieren (genau), was Ihre ranking-Funktion wirklich ist. Was ist, wenn Sie eine Zeile "Spa." oder "spa.com"? Sobald Sie definiert sind, müssen Sie, um diese Logik in die ORDER BY-Klausel. Zum Beispiel:
Alternativ könnten Sie schreiben, eine ranking-Funktion und verwenden Sie, dass:
Performance auf sehr großen Resultsets kann nicht zu groß sein, so dass dieser Ansatz hängt von Ihren erwarteten suchergebnis Größen.
Sollte dies funktionieren: