Query uitvoeren met de zoekopdracht Full-Text
van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Schrijf volledige tekstquery's door gebruik te maken van de predicaten CONTAINS en FREETEXT en de functies met rijset-waarden CONTAINSTABLE en FREETEXTTABLE met een SELECT instructie. Dit artikel bevat voorbeelden van elk predicaat en elke functie en helpt u bij het kiezen van het beste dat u kunt gebruiken.
- Gebruik CONTAINS en CONTAINSTABLEom woorden en woordgroepen te matchen.
- Om de betekenis te evenaren, maar niet de exacte formulering, gebruik FREETEXT en FREETEXTTABLE.
Voorbeelden van elk predicaat en elke functie
In de volgende voorbeelden wordt de AdventureWorks-voorbeelddatabase gebruikt. Zie AdventureWorks Databases and Scripts for SQL Server 2016 CTP3voor de definitieve release van AdventureWorks. Als u de voorbeeldquery's wilt uitvoeren, moet u ook Full-Text Search instellen. Zie Aan de slag met Full-Text Zoekenvoor meer informatie.
Voorbeeld - CONTAINS
In het volgende voorbeeld worden alle producten met een prijs van $80.99
gevonden die het woord "Mountain"
bevatten:
USE AdventureWorks2022
GO
SELECT Name, ListPrice
FROM Production.Product
WHERE ListPrice = 80.99
AND CONTAINS(Name, 'Mountain')
GO
Voorbeeld - FREETEXT
In het volgende voorbeeld wordt gezocht naar alle documenten die woorden bevatten die betrekking hebben op vital safety components
:
USE AdventureWorks2022
GO
SELECT Title
FROM Production.Document
WHERE FREETEXT (Document, 'vital safety components')
GO
Voorbeeld - CONTAINSTABLE
In het volgende voorbeeld worden de beschrijvings-ID en beschrijving geretourneerd van alle producten waarvoor de kolom Beschrijving het woord 'aluminium' in de buurt bevat van het woord 'licht' of 'lichtgewicht'. Alleen rijen met een rang van 2 of hoger worden geretourneerd.
USE AdventureWorks2022
GO
SELECT FT_TBL.ProductDescriptionID,
FT_TBL.Description,
KEY_TBL.RANK
FROM Production.ProductDescription AS FT_TBL INNER JOIN
CONTAINSTABLE (Production.ProductDescription,
Description,
'(light NEAR aluminum) OR
(lightweight NEAR aluminum)'
) AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEY_TBL.RANK DESC;
GO
Voorbeeld - FREETEXTTABLE
In het volgende voorbeeld wordt een FREETEXTTABLE-query uitgebreid om eerst de hoogste gerangschikte rijen te retourneren en de rangorde van elke rij toe te voegen aan de selectielijst. Als u een vergelijkbare query wilt schrijven, moet u weten dat ProductDescriptionID de unieke sleutelkolom is voor de Tabel ProductDescription.
USE AdventureWorks2022
GO
SELECT KEY_TBL.RANK, FT_TBL.Description
FROM Production.ProductDescription AS FT_TBL
INNER JOIN
FREETEXTTABLE(Production.ProductDescription, Description,
'perfect all-around bike') AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC
GO
Hier volgt een uitbreiding van dezelfde query die alleen rijen retourneert met een rang van 10 of hoger:
USE AdventureWorks2022
GO
SELECT KEY_TBL.RANK, FT_TBL.Description
FROM Production.ProductDescription AS FT_TBL
INNER JOIN
FREETEXTTABLE(Production.ProductDescription, Description,
'perfect all-around bike') AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK >= 10
ORDER BY KEY_TBL.RANK DESC
GO
Woorden vergelijken of betekenis vergelijken
CONTAINS
/
CONTAINSTABLE
en FREETEXT
/FREETEXTTABLE
zijn handig voor verschillende soorten overeenkomsten. Met de volgende informatie kunt u het beste predicaat of de beste functie voor uw query kiezen:
CONTAINS/CONTAINSTABLE
- Koppel enkelvoudige woorden en woordgroepen met exacte of vage (minder nauwkeurige) overeenkomsten.
- U kunt ook het volgende doen:
- Geef de nabijheid van woorden op binnen een bepaalde afstand van elkaar.
- Retourneert gewogen overeenkomsten.
- Zoekvoorwaarden combineren met logische operators. Zie Booleaanse operatoren (AND, OR en NOT) gebruiken verderop in dit artikel voor meer informatie.
FREETEXT/FREETEXTTABEL
- Komt overeen met de betekenis, maar niet de exacte formulering, van opgegeven woorden, woordgroepen of zinnen (de vrije-teksttekenreeks).
- Overeenkomsten worden gegenereerd als een term of vorm van een term wordt gevonden in de volledige-tekstindex van een opgegeven kolom.
Predicaten en functies vergelijken
De predicaten CONTAINS
/FREETEXT
en de functies met de rijsetwaarde CONTAINSTABLE
/FREETEXTTABLE
verschillende syntaxis en opties hebben. Met de volgende informatie kunt u het beste predicaat of de beste functie voor uw query kiezen:
Predicaten CONTAINS en FREETEXT
Gebruik. Gebruik de full-text -predicaten CONTAINS en FREETEXT in de WHERE- of HAVING-clausule van een SELECT-instructie.
resultaten. De CONTAINS- en FREETEXT-predicaten retourneren een TRUE- of FALSE-waarde die aangeeft of een bepaalde rij overeenkomt met de volledige-tekstquery. Overeenkomende rijen worden geretourneerd in de resultatenset.
Meer opties. U kunt de predicaten combineren met een van de andere Transact-SQL predicaten, zoals LIKE en BETWEEN.
U kunt één kolom, een lijst met kolommen of alle kolommen in de tabel opgeven die moeten worden doorzocht.
U kunt desgewenst de taal opgeven waarvan de bronnen worden gebruikt door de volledige-tekstquery voor woordbreking, stemming, synoniemenlijstzoekopdrachten en het verwijderen van ruiswoorden.
U kunt een vierdelige naam in het predicaat CONTAINS of FREETEXT gebruiken om een query uit te voeren op geïndexeerde kolommen in volledige tekst van de doeltabellen op een gekoppelde server. Als u een externe server wilt voorbereiden voor het ontvangen van query's in volledige tekst, maakt u een volledige-tekstindex op de doeltabellen en -kolommen op de externe server en voegt u de externe server vervolgens toe als een gekoppelde server.
Meer informatie. Zie CONTAINS en FREETEXTvoor meer informatie over de syntaxis en argumenten van deze predicaten.
Rowset-gewaardeerde Functies CONTAINSTABLE en FREETEXTTABLE
Gebruik. Gebruik de volledige tekstfuncties , zoals CONTAINSTABLE- en FREETEXTTABLE-functies, net als een gewone tabelnaam in de FROM-clausule van een SELECT-instructie.
U moet de basistabel opgeven om te zoeken wanneer u een van deze functies gebruikt. Net als bij de predicaten kunt u één kolom, een lijst met kolommen of alle kolommen in de tabel opgeven die moeten worden doorzocht, en eventueel de taal waarvan de resources worden gebruikt door een volledige-tekstquery.
Normaal gesproken moet u de resultaten van CONTAINSTABLE of FREETEXTTABLE samenvoegen met de basistabel. Als u de tabellen wilt samenvoegen, moet u de naam van de unieke sleutelkolom weten. Deze kolom, die voorkomt in elke tabel met volledige tekst, wordt gebruikt om unieke rijen af te dwingen voor de tabel (de unieke**sleutelkolom). Zie Full-Text Indexen maken en beherenvoor meer informatie over de sleutelkolom.
Resultaten. Deze functies retourneren een tabel met nul, een of meer rijen die overeenkomen met de query voor volledige tekst. De geretourneerde tabel bevat alleen rijen uit de basistabel die voldoen aan de selectiecriteria die zijn opgegeven in de zoekvoorwaarde voor volledige tekst van de functie.
Query's die een van deze functies gebruiken, retourneren als volgt een relevantierangschikkingswaarde (RANK) en een sleutel voor volledige tekst (KEY) voor elke geretourneerde rij:
- KEY kolom. De kolom KEY retourneert unieke waarden van de geretourneerde rijen. De kolom SLEUTEL kan worden gebruikt om selectiecriteria op te geven.
- RANK kolom. De kolom RANK retourneert een rangschikkingswaarde voor elke rij die aangeeft hoe goed de rij overeenkomt met de selectiecriteria. Hoe hoger de rangschikkingswaarde van de tekst of het document in een rij, hoe relevanter de rij is voor de opgegeven query voor volledige tekst. Verschillende rijen kunnen identiek worden gerangschikt. U kunt het aantal overeenkomsten beperken dat moet worden geretourneerd door de optionele top_n_by_rank parameter op te geven. Zie Zoekresultaten beperken met RANKvoor meer informatie.
Meer informatie. Zie CONTAINSTABLE- en FREETEXTTABLEvoor meer informatie over de syntaxis en argumenten van deze functies.
Specifieke typen zoekopdrachten
Zoeken naar een specifiek woord of een bepaalde woordgroep (eenvoudige term)
U kunt CONTAINS-, CONTAINSTABLE-, FREETEXT-of FREETEXTTABLE- gebruiken om in een tabel naar een bepaald woord of een bepaalde woordgroep te zoeken. Als u bijvoorbeeld wilt zoeken in de tabel ProductReview in de AdventureWorks2022
-database om alle opmerkingen over een product te vinden met de woordgroep 'leercurve', kunt u het predicaat CONTAINS als volgt gebruiken:
USE AdventureWorks2022
GO
SELECT Comments
FROM Production.ProductReview
WHERE CONTAINS(Comments, '"learning curve"')
GO
De zoekvoorwaarde, in dit geval 'leercurve', kan complex zijn en kan bestaan uit een of meer termen.
Meer informatie over eenvoudige zoektermen
Bij zoeken in volledige tekst is een woord (of token) een tekenreeks waarvan de grenzen worden geïdentificeerd door de juiste woordonderbrekers, volgens de taalkundige regels van de opgegeven taal. Een geldige woordgroep bestaat uit meerdere woorden, met of zonder interpunctie ertussen.
'croissant' is bijvoorbeeld een woord en 'café au lait' is een uitdrukking. Woorden en woordgroepen zoals deze worden eenvoudige termen genoemd.
CONTAINS en CONTAINSTABLE zoeken naar een exacte overeenkomst voor de woordgroep. FREETEXT en FREETEXTTABLE splitsen de zinsnede op in afzonderlijke woorden.
Een woord zoeken met een voorvoegsel (voorvoegselterm)
U kunt CONTAINS- of CONTAINSTABLE- gebruiken om te zoeken naar woorden of woordgroepen met een opgegeven voorvoegsel. Alle vermeldingen in de kolom die tekst bevatten die beginnen met het opgegeven voorvoegsel, worden geretourneerd. Als u bijvoorbeeld wilt zoeken naar alle rijen met het voorvoegsel top
-, zoals in top``ple
, top``ping
en top
. De query ziet er als volgt uit:
USE AdventureWorks2022
GO
SELECT Description, ProductDescriptionID
FROM Production.ProductDescription
WHERE CONTAINS (Description, '"top*"' )
GO
Alle tekst die overeenkomt met de tekst die is opgegeven voordat het sterretje (*) wordt geretourneerd. Als de tekst en het sterretje niet worden gescheiden door dubbele aanhalingstekens, zoals in CONTAINS (DESCRIPTION, 'top*')
, wordt het sterretje in een volledige-tekst zoekopdracht niet als jokerteken beschouwd.
Wanneer de voorvoegselterm een woordgroep is, wordt elk token dat bestaat uit de woordgroep beschouwd als een afzonderlijke voorvoegselterm. Alle rijen met woorden die beginnen met de voorvoegseltermen, worden geretourneerd. De voorvoegselterm 'licht brood*' vindt bijvoorbeeld rijen met tekst van 'licht gebakken', 'lichtgebakken' of 'licht brood', maar retourneert geen 'licht geroosterd brood'.
Meer informatie over zoekopdrachten voor voorvoegsels
Een voorvoegselterm verwijst naar een tekenreeks die aan de voorzijde van een woord is aangebracht om een afgeleid woord of een vervormde vorm te produceren.
Voor één voorvoegselterm maakt elk woord dat begint met de opgegeven term deel uit van de resultatenset. De term 'auto*' komt bijvoorbeeld overeen met 'automatisch', 'auto', enzovoort.
Voor een woordgroep wordt elk woord in de woordgroep beschouwd als een voorvoegselterm. De term 'auto tran*' komt bijvoorbeeld overeen met 'automatische transmissie' en 'autotransducer', maar komt niet overeen met 'automatische motortransmissie'.
Voorvoegselzoekopdrachten worden ondersteund door CONTAINS- en CONTAINSTABLE-.
Zoeken naar inflectionele vormen van een specifiek woord (generatieterm)
U kunt CONTAINS, CONTAINSTABLE, FREETEXTof FREETEXTTABLE gebruiken om te zoeken naar alle verschillende tijden en vervoegingen van een werkwoord of zowel de enkelvoudige als de meervoudsvormen van een zelfstandig naamwoord (een inflectionele zoekopdracht) of voor synoniemen van een woord (een synoniemenzoek).
In het volgende voorbeeld wordt gezocht naar een willekeurige vorm van 'voet' ('voet', 'voeten', enzovoort) in de kolom Comments
van de tabel ProductReview
in de AdventureWorks
-database:
USE AdventureWorks2022
GO
SELECT Comments, ReviewerName
FROM Production.ProductReview
WHERE CONTAINS (Comments, 'FORMSOF(INFLECTIONAL, "foot")')
GO
Zoeken in volledige tekst maakt gebruik van stemmers, waarmee u kunt zoeken naar de verschillende tijden en vervoegingen van een werkwoord, of zowel de enkelvoudsvormen als de meervoudsvormen van een zelfstandig naamwoord. Voor meer informatie over stemmers, zie Word Breakers en Stemmers configureren en beheren voor zoekopdrachten.
Meer informatie over zoekopdrachten voor generatietermen
De inflectionele vormen zijn de verschillende gespannen en samenvoegingen van een werkwoord of de enkelvoudige en meervoudsvormen van een zelfstandig naamwoord.
Zoek bijvoorbeeld naar de inflectionele vorm van het woord 'drive'. Als verschillende rijen in de tabel de woorden 'drive', 'drives', 'drove', 'driving' en 'driven' bevatten, bevinden al deze rijen zich in de resultatenset, omdat elk van deze kan worden gegenereerd op basis van het woord 'drive'.
FREETEXT en FREETEXTTABLE zoeken standaard naar inflectionele termen van alle opgegeven woorden.
CONTAINS en CONTAINSTABLE ondersteunt optioneel INFLECTIONAL
argument.
Zoeken naar synoniemen van een specifiek woord
Een synoniemenlijst definieert door de gebruiker opgegeven synoniemen voor termen. Zie Synoniemenlijstbestanden configureren en beheren voor Full-Text zoekenvoor meer informatie over synoniemenlijstbestanden.
Als bijvoorbeeld een vermelding {auto, auto, vrachtwagen, van}, wordt toegevoegd aan een synoniemenlijst, kunt u zoeken naar de synoniemenlijstvorm van het woord 'auto'. Alle rijen in de tabel die de woorden 'automobile', 'truck', 'bus' of 'auto' bevatten, worden weergegeven in de resultatenset, omdat elk van deze woorden behoort tot de synoniemenuitbreidingsset met het woord 'auto'.
FREETEXT en FREETEXTTABLE gebruiken standaard de synoniemenlijst.
CONTAINS en CONTAINSTABLE ondersteunt een optioneel THESAURUS
argument.
Zoek een woord in de buurt van een ander woord
Een nabijheidsterm geeft woorden of woordgroepen aan die zich dicht bij elkaar bevinden. U kunt ook het maximum aantal niet-zoektermen opgeven dat de eerste en laatste zoektermen scheidt. Daarnaast kunt u zoeken naar woorden of woordgroepen in elke volgorde, of in de volgorde waarin u deze opgeeft.
U wilt bijvoorbeeld de rijen zoeken waarin het woord 'ijs' zich in de buurt bevindt van het woord 'hockey' of waarin de woordgroep 'schaatsen' zich in de buurt bevindt van de woordgroep 'ij hockey'.
Zie Zoeken naar woorden dicht bij een ander woord met NEARvoor meer informatie over nabijheidszoekopdrachten.
Zoeken naar woorden of woordgroepen met behulp van gewogen waarden (gewogen term)
U kunt CONTAINSTABLE- gebruiken om te zoeken naar woorden of woordgroepen en een wegingswaarde op te geven. Gewicht, gemeten als een getal van 0,0 tot en met 1,0, geeft het belang aan van elk woord en elke woordgroep binnen een reeks woorden en woordgroepen. Een gewicht van 0,0 is het laagste en een gewicht van 1,0 is het hoogste.
In het volgende voorbeeld ziet u een query waarmee wordt gezocht naar alle klantadressen, met behulp van gewichten, waarbij elke tekst die begint met de tekenreeks 'Bay' 'Street' of 'View' heeft. De resultaten geven een hogere rang aan die rijen die meer van de opgegeven woorden bevatten.
USE AdventureWorks2022
GO
SELECT AddressLine1, KEY_TBL.RANK
FROM Person.Address AS Address INNER JOIN
CONTAINSTABLE(Person.Address, AddressLine1, 'ISABOUT ("Bay*",
Street WEIGHT(0.9),
View WEIGHT(0.1)
) ' ) AS KEY_TBL
ON Address.AddressID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC
GO
Een gewogen term kan worden gebruikt in combinatie met elke eenvoudige term, voorvoegselterm, generatieterm of nabijheidsterm.
Meer informatie over gewogen zoektermen
In een gewogen zoekterm geeft een gewichtswaarde de mate van belang aan voor elk woord en elke woordgroep binnen een set woorden en woordgroepen. Een gewichtswaarde van 0,0 is de laagste en een gewichtswaarde van 1,0 is de hoogste.
In een query die bijvoorbeeld zoekt naar meerdere termen, kunt u elk zoekwoord een gewichtswaarde toewijzen die het belang aangeeft ten opzichte van de andere woorden in de zoekvoorwaarde. De resultaten voor dit type query retourneren eerst de meest relevante rijen, afhankelijk van het relatieve gewicht dat u aan zoekwoorden hebt toegewezen. De resultatensets bevatten documenten of rijen met een van de opgegeven termen (of inhoud ertussen); sommige resultaten worden echter als relevanter beschouwd dan andere vanwege de variatie in de gewogen waarden die zijn gekoppeld aan verschillende zoektermen.
Gewogen zoektermen worden ondersteund door CONTAINSTABLE.
And, OR en NOT (Booleaanse operatoren) gebruiken
De functie CONTAINS predicaat en CONTAINSTABLE gebruiken dezelfde zoekvoorwaarden. Beide bieden ondersteuning voor het combineren van verschillende zoektermen met booleaanse operatoren ( AND, OR en NOT) om logische bewerkingen uit te voeren. U kunt AND gebruiken om bijvoorbeeld rijen te zoeken die zowel 'latte' als 'New York-style bagel' bevatten. U kunt AND NOT bijvoorbeeld gebruiken om de rijen te vinden die 'bagel' bevatten, maar geen roomkaas bevatten.
Daarentegen behandelen FREETEXT en FREETEXTTABLE de Booleaanse termen als woorden die moeten worden doorzocht.
Zie Zoekvoorwaarde (Transact-SQL)voor informatie over het combineren van CONTAINS met andere predicaten die gebruikmaken van de logische operatoren AND, OR en NOT.
Voorbeeld
In het volgende voorbeeld wordt het predicaat CONTAINS gebruikt om te zoeken naar beschrijvingen waarin de beschrijvings-id niet gelijk is aan 5 en de beschrijving zowel het woord 'Aluminium' als het woord 'spindle' bevat. De zoekvoorwaarde maakt gebruik van de OPERATOR AND Boolean. In dit voorbeeld wordt de tabel ProductDescription van de AdventureWorks2022
-database gebruikt.
USE AdventureWorks2022
GO
SELECT Description
FROM Production.ProductDescription
WHERE ProductDescriptionID <> 5 AND
CONTAINS(Description, 'aluminum AND spindle')
GO
Hoofdletters, stopwoorden, taal en synoniemenlijst
Wanneer u query's voor volledige tekst schrijft, kunt u ook de volgende opties opgeven:
hoofdlettergevoeligheid. Zoekquery's in volledige tekst zijn niet hoofdlettergevoelig. In het Japans zijn er echter meerdere fonetische orthografieën waarin het concept van orthografische normalisatie vergelijkbaar is met hoofdletterongevoeligheid (bijvoorbeeld kana = ongevoeligheid voor hoofdletters). Dit type ortografische normalisatie wordt niet ondersteund.
Stopwords. Bij het definiëren van een query voor volledige tekst worden stopwoorden (ook wel ruiswoorden genoemd) door de Full-Text Engine verwijderd uit de zoekcriteria. Stopwoorden zijn woorden zoals 'a', 'en', 'is' of 'de', die vaak kunnen optreden, maar die meestal niet helpen bij het zoeken naar bepaalde tekst. Stopwords worden vermeld in een stoplijst. Elke volledige-tekstindex wordt gekoppeld aan een specifieke stoplijst, die bepaalt welke stopwoorden worden weggelaten uit de query of de index tijdens het indexeren. Voor meer informatie, zie Stopwords en Stoplists configureren en beheren voor Full-Text Zoeken.
Languagemet de optie LANGUAGE. Veel zoektermen zijn sterk afhankelijk van het gedrag van de woordafbreker. Om ervoor te zorgen dat u de juiste woordonderbreker (en stemmer) en synoniemenlijst gebruikt, raden we u aan de optie TAAL op te geven. Zie Een taal kiezen bij het maken van een Full-Text Indexvoor meer informatie.
synoniemenlijst. FREETEXT- en FREETEXTTABLE-query's maken standaard gebruik van de synoniemenlijst. CONTAINS en CONTAINSTABLE ondersteunen een optioneel SYNONIEMENLIJST-argument. Voor meer info, zie Synoniemenlijstbestanden configureren en beheren voor Full-Text zoeken.
De tokenisatieresultaten controleren
Nadat u een specifieke combinatie van een woordonderbreker, synoniemenlijst en stoplijst in een query hebt toegepast, kunt u zien hoe Full-Text de resultaten tokenizeert met behulp van de dynamische beheerweergave sys.dm_fts_parser. Zie sys.dm_fts_parser (Transact-SQL)voor meer informatie.
Zie ook
BEVAT (Transact-SQL)
CONTAINSTABLE (Transact-SQL)
FREETEXT (Transact-SQL)
FREETEXTTABLE (Transact-SQL)
Full-Text Search Query's (Visual Database Tools) maken
de prestaties van Full-Text query's verbeteren