sql >> Database >  >> RDS >> Sqlserver

Opgeslagen T-SQL-procedure om zoekresultaten in Google-stijl te retourneren

Ik ga zoeken in volledige tekst voorstellen (MS' of Lucene zal werken) De onderstaande code gebruikt MSSQL FTS zoals ik momenteel in mijn app gebruik.

Installeer FTS Search als je dat nog niet hebt gedaan. Als u hebt gecontroleerd of de service actief is, voert u dit uit in de beheerstudio om een ​​catalogus in te stellen en de producttabel toe te voegen; en kleur / naam / productnummer naar de catalogus.

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

U kunt dan query's uitvoeren op alle kolommen tegelijk; bijv. Zilver (gekozen vanwege kleur en naam)

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

De * op de zoekopdracht zal Silver* vinden, dus u kunt dit gebruiken om resultaten op te bouwen terwijl de gebruiker typt. Een ding om te overwegen is dat Google dit in realtime laat werken - als u veel gegevens zoekt, kunt u om de gegevens terug te krijgen zonder het typen van de gebruiker te onderbreken. ik denk dat mensen deze zoekopdrachten over het algemeen gebruiken door te typen vanaf de eerste letter waarnaar ze op zoek zijn - ik accepteer dat er spelfouten zullen zijn - je zou een spellingcontrole kunnen implementeren na elke spatie die ze indrukken, misschien om dat af te handelen. Of sla de zoekopdrachten op die worden uitgevoerd en bekijk de spelfouten en wijzig de code om dat af te handelen op basis van een toewijzing (of in FTS met behulp van een aangepaste thesaurus.)

Ranking wordt een leuk ontwikkelingsprobleem voor elk bedrijf; vindt u het eerste resultaat voor Mountain Frame -of wilt u ze wegen op verkoop of prijs? Als de gebruiker meer dan één tekstterm intypt, kunt u FTS gebruiken om een ​​rangschikking te maken op basis van de zoekreeks.

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

Dit levert 30 rijen op; en gewichten op basis van de door de gebruiker ingevoerde tekst om de record op de eerste plaats te bepalen. In beide gevallen zult u waarschijnlijk een gecodeerde rangschikking willen toevoegen om de resultaten aan te passen aan uw zakelijke wensen - het rangschikken van de best geprijsde widget 1 is misschien niet de manier. Daarom ga je opslaan waar mensen naar hebben gezocht/geklikt, zodat je de resultaten later kunt analyseren.

Er is een hele mooie taalparser voor .Net dat een Google-achtige string-query vertaalt die is ingevoerd in FTS-taal die bekendheid geeft aan alle booleaanse zoekopdrachten die uw site gebruiken.

Misschien wilt u ook wat wijsheid van menigte-functies toevoegen door te controleren wat gebruikers hebben ingevoerd en uiteindelijk zijn gaan bezoeken en succeskaarten gebruiken om de uiteindelijke suggesties te wijzigen om ze daadwerkelijk relevant te maken voor de gebruiker.

Als laatste suggestie, als dit een commerciële website is, zou je kunnen kijken naar Easyask wat een enge geweldige natuurlijke taalprocessor is



  1. De 'LIKE'-operator gebruiken met een subquery die meerdere resultaten oplevert

  2. Hoe een vensterfunctie gebruiken om te bepalen wanneer verschillende taken in Hive of Postgres moeten worden uitgevoerd?

  3. som hoogste opeenvolgende gebeurtenis

  4. De stap Unpivot gebruiken om een ​​tabel in tabelvorm te maken van een kruistabel