Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Gespeicherte T-SQL-Prozedur zur Rückgabe von Suchergebnissen im Google-Stil

Ich werde eine Volltextsuche vorschlagen (MS oder Lucene funktionieren). Der folgende Code verwendet MSSQL FTS als das, was ich im Moment in meiner App verwende.

Installieren Sie die FTS-Suche, falls Sie dies noch nicht getan haben. Wenn Sie überprüfen, ob der Dienst ausgeführt wird. Führen Sie dies im Management Studio aus, um einen Katalog einzurichten und die Produkttabelle hinzuzufügen. und Farbe / Name / Produktnummer zum Katalog.

USE [AdventureWorks]
GO
CREATE FULLTEXT CATALOG [ProductsTest]WITH ACCENT_SENSITIVITY = OFF
AUTHORIZATION [dbo]

GO

USE [AdventureWorks]
GO
CREATE FULLTEXT INDEX ON [Production].[Product] KEY INDEX [PK_Product_ProductID] ON ([ProductsTest]) WITH (CHANGE_TRACKING AUTO)
GO
USE [AdventureWorks]
GO
ALTER FULLTEXT INDEX ON [Production].[Product] ADD ([Color])
GO
USE [AdventureWorks]
GO
ALTER FULLTEXT INDEX ON [Production].[Product] ADD ([Name])
GO
USE [AdventureWorks]
GO
ALTER FULLTEXT INDEX ON [Production].[Product] ADD ([ProductNumber])
GO
USE [AdventureWorks]
GO
ALTER FULLTEXT INDEX ON [Production].[Product] ENABLE
GO

Sie können dann Abfragen für alle Spalten gleichzeitig ausführen; z.B. Silber (ausgewählt in Farbe und Name)

Select * from production.product where
contains(*, '"Silver*"')

Das * in der Abfrage findet Silber*, sodass Sie dies verwenden können, um Ergebnisse aufzubauen, während der Benutzer eintippt. Eine Sache, die Sie berücksichtigen sollten, ist, dass Google dies in Echtzeit macht - wenn Sie viele Daten durchsuchen, können Sie dies tun um die Daten zurückzubekommen, ohne die Eingabe des Benutzers zu unterbrechen. Ich denke, im Allgemeinen verwenden die Leute diese Suchen, indem sie ab dem ersten Buchstaben eingeben, nach dem sie suchen - ich akzeptiere, dass es Rechtschreibfehler geben wird - Sie könnten nach jedem Leerzeichen, das sie drücken, eine Rechtschreibprüfung implementieren, um dies zu beheben. Oder speichern Sie die ausgeführten Suchen und sehen Sie sich die Rechtschreibfehler an und ändern Sie den Code, um dies basierend auf einer Zuordnung (oder in FTS mit einem benutzerdefinierten Thesaurus) zu handhaben.

Das Ranking wird für jedes Unternehmen ein lustiges Entwicklungsproblem sein; Finden Sie die ersten Ergebnisse für Mountain Frame – oder möchten Sie sie nach Umsatz oder Preis gewichten? Wenn der Benutzer mehr als einen Textbegriff eingibt, können Sie FTS verwenden, um ein Ranking basierend auf der Suchzeichenfolge zu erstellen.

select aa.rank, bb.* 
From containstable(production.product, *, '"Mountain" and "Silver*"') aa
inner join production.product bb
on aa.[key] = bb.productid
order by rank desc

Dies gibt 30 Zeilen zurück; und Gewichtungen basierend auf dem vom Benutzer eingegebenen Text, um den Rekord für den ersten Platz zu bestimmen. In beiden Fällen möchten Sie wahrscheinlich ein codiertes Ranking hinzufügen, um die Ergebnisse an Ihre geschäftlichen Wünsche anzupassen - das Ranking des teuersten Widgets 1 ist möglicherweise nicht der richtige Weg. Aus diesem Grund werden Sie speichern, wonach Personen gesucht/geklickt haben, damit Sie die Ergebnisse später analysieren können.

Es gibt einen wirklich netten Sprachparser für .Net, das eine Zeichenfolgenabfrage im Google-Stil übersetzt, die in eine FTS-fähige Sprache eingegeben wird, was Vertrautheit mit allen booleschen Suchen vermittelt, die Ihre Website verwenden.

Möglicherweise möchten Sie auch einige „Witness of Crowds“-Funktionen hinzufügen, indem Sie prüfen, was Benutzer eingegeben haben, und schließlich Erfolgskarten besuchen und verwenden, um die endgültigen Vorschläge zu ändern, damit sie für den Benutzer tatsächlich relevant sind.

Als letzten Vorschlag, wenn dies eine kommerzielle Website ist, sollten Sie sich Easyask ansehen das ist ein beängstigend großartiger Prozessor für natürliche Sprache