Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om mappen te wijzigen.
van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Schrijf full-text queries door gebruik te maken van de predicaten CONTAINS en FREETEXT en de rijset-waarde functies CONTAINSTABLE en FREETEXTTABLE met een SELECT statement. Dit artikel bevat voorbeelden van elk predicaat en elke functie en helpt u bij het kiezen van het beste dat u kunt gebruiken.
- Om woorden en uitdrukkingen te matchen, gebruik
CONTAINSenCONTAINSTABLE. - Om de betekenis te behouden, maar niet de exacte formulering, gebruik
FREETEXTenFREETEXTTABLE.
Voorbeelden van elk predicaat en elke functie
De codevoorbeelden in dit artikel gebruiken de AdventureWorks2025 of AdventureWorksDW2025 voorbeelddatabase die u kunt downloaden van de startpagina van Microsoft SQL Server Samples en Community Projects .
Als u de voorbeeldquery's wilt uitvoeren, moet u ook Full-Text Search instellen. Voor meer informatie, zie Begin met Full-Text Zoek.
Voorbeeld: CONTAINS
In het volgende voorbeeld worden alle producten met een prijs van $80.99 gevonden die het woord Mountainbevatten:
USE AdventureWorks2025;
GO
SELECT Name,
ListPrice
FROM Production.Product
WHERE ListPrice = 80.99
AND CONTAINS ((Name), 'Mountain');
GO
Voorbeeld: VRIJTEKST
In het volgende voorbeeld wordt gezocht naar alle documenten die woorden bevatten die betrekking hebben op vital safety components:
USE AdventureWorks2025;
GO
SELECT Title
FROM Production.Document
WHERE FREETEXT ((Document), 'vital safety components');
GO
Voorbeeld: CONTAINSTABLE
Het volgende voorbeeld geeft de beschrijvings-ID en beschrijving van alle producten waarvoor de Description kolom het woord aluminum bevat nabij het woord light of het woord lightweight. Alleen rijen met een rang hoger dan 2 worden teruggegeven.
USE AdventureWorks2025;
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
Het volgende voorbeeld wijdt een FREETEXTTABLE query uit om eerst de hoogst gerangschikte rijen terug te geven en de rangorde van elke rij toe te voegen aan de selectielijst. Om een vergelijkbare query te schrijven, moet je weten dat ProductDescriptionID de unieke sleutelkolom voor de ProductDescription tabel is.
USE AdventureWorks2025;
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 AdventureWorks2025;
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 en CONTAINSTABLE, of FREETEXT en FREETEXTTABLE, zijn nuttig voor verschillende soorten matching. De volgende informatie helpt u om het beste predicaat of functie voor uw zoekopdracht te kiezen:
CONTAINS en 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. Voor meer informatie, zie Gebruik Booleaanse operatoren (EN, OF en NIET) later in dit artikel.
VRIJTEKST en VRIJTEKSTTABEL
- 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 of FREETEXT en de functies CONTAINSTABLE of FREETEXTTABLE met rijensetwaarde hebben verschillende syntaxis en opties. De volgende informatie helpt u om het beste predicaat of functie voor uw zoekopdracht te kiezen:
Predicaten CONTAINS en FREETEXT
Gebruik. Gebruik de CONTAINS- en FREETEXT-full-textpredicaten in de component WHERE of HAVING van een SELECT-instructie.
resultaten. De predicaten CONTAINS en FREETEXT retourneren de waarde TRUE of FALSE, die aangeeft of een bepaalde rij overeenkomt met de volledige-tekstquery. Overeenkomende rijen worden geretourneerd in de resultatenset.
Meer opties. Je kunt de predicaten combineren met elk 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.
Je kunt een vierdelige naam in het CONTAINS of FREETEXT predicaat gebruiken om full-text geïndexeerde kolommen van de doeltabellen op een gekoppelde server te bevragen. 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.
Voor meer informatie over de syntaxis en argumenten van deze predicaten, zie CONTAINS en FREETEXT.
Rowset-gewaardeerde Functies CONTAINSTABLE en FREETEXTTABLE
Gebruik. Gebruik de volledige tekst CONTAINSTABLE en FREETEXTTABLE functioneert als een gewone tabelnaam in de FROM clausule van een SELECT statement.
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.
Meestal moet je de resultaten van CONTAINSTABLE of FREETEXTTABLE met de basistabel verbinden. Als u de tabellen wilt samenvoegen, moet u de naam van de unieke sleutelkolom weten. Deze kolom, die voorkomt in elke tabel waarvoor volledige-tekstzoekopdrachten zijn ingeschakeld, wordt gebruikt om unieke rijen in de tabel af te dwingen (de kolom met unieke sleutel). Voor meer informatie over de sleutelkolom, zie Maak en beheer volledige tekstindexen.
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.
Zoekopdrachten die een van deze functies gebruiken, geven ook een relevantierangschikkingswaarde (RANK) en een volledige teksttoets (KEY) voor elke teruggegeven rij terug, als volgt:
KEYkolom. DeKEYkolom geeft unieke waarden van de teruggestuurde rijen terug. DeKEYkolom kan worden gebruikt om selectiecriteria te specificeren.RANKkolom. DeRANKkolom geeft voor elke rij een rangwaarde terug die aangeeft hoe goed de rij voldeed aan 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. Voor meer informatie, zie Beperk zoekresultaten met rang.
Voor meer informatie over de syntaxis en argumenten van deze functies, zie CONTAINSTABLE en FREETEXTTABLE.
Specifieke typen zoekopdrachten
Zoek naar een specifiek woord of uitdrukking (eenvoudige term)
Je kunt CONTAINS, CONTAINSTABLE, FREETEXT, gebruiken of FREETEXTTABLE in een tabel zoeken naar een specifiek woord of uitdrukking. Als je bijvoorbeeld in de ProductReview tabel in de AdventureWorks2025 database wilt zoeken naar alle opmerkingen over een product met de uitdrukking learning curve, kun je het CONTAINS predicaat als volgt gebruiken:
USE AdventureWorks2025;
GO
SELECT Comments
FROM Production.ProductReview
WHERE CONTAINS ((Comments), '"learning curve"');
GO
De zoekvoorwaarde kan in dit geval learning curvecomplex zijn en kan bestaan uit één of meer termen.
Meer informatie over eenvoudige termenzoekopdrachten
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.
Bijvoorbeeld, croissant is een woord, en café au lait is een uitdrukking. Woorden en uitdrukkingen zoals deze worden eenvoudige termen genoemd.
CONTAINS en CONTAINSTABLE zoeken naar een exacte overeenkomst voor de woordgroep.
FREETEXT en FREETEXTTABLE splitsen de woordgroep op in aparte woorden.
Zoek naar een woord met een voorvoegsel (voorvoegselterm)
Je 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. Om bijvoorbeeld te zoeken naar alle rijen die het prefix top-bevatten, zoals in topple, topping, en top, ziet de query eruit als het volgende voorbeeld:
USE AdventureWorks2025;
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 afgebakend door dubbele aanhalingstekens, zoals in CONTAINS (DESCRIPTION, 'top*'), beschouwt de volledige tekstzoekopdracht het asterisk niet als een joker.
Wanneer de voorvoegselterm een woordgroep is, wordt elk token dat bestaat uit de woordgroep beschouwd als een afzonderlijke voorvoegselterm. Alle rijen die woorden hebben die beginnen met de prefixtermen worden teruggegeven. Bijvoorbeeld, de voorvoegselterm light bread* vindt rijen met tekst van light breaded, lightly breaded, of light bread, maar geeft geen terug.lightly toasted bread
Meer informatie over zoekopdrachten met 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 een enkele prefixterm is elk woord dat begint met de gespecificeerde term onderdeel van de resultaatset. Bijvoorbeeld, de term
auto*komt overeen metautomatic,automobile, enzovoort.Voor een woordgroep wordt elk woord in de woordgroep beschouwd als een voorvoegselterm. Bijvoorbeeld, de term
auto tran*komt overeen metautomatic transmissionenautomobile transducer, maar niet metautomatic motor transmission.
Prefixzoekopdrachten worden ondersteund door CONTAINS en CONTAINSTABLE.
Zoek naar verbuigingsvormen van een specifiek woord (generatieterm)
Je kunt CONTAINS, CONTAINSTABLE, FREETEXT of FREETEXTTABLE gebruiken om te zoeken naar alle verschillende werkwoordstijden en vervoegingen van een werkwoord of naar de enkelvouds- en meervoudsvormen van een zelfstandig naamwoord (een zoekopdracht naar woordvormen), of naar synonieme vormen van een bepaald woord (een thesauruszoekopdracht).
Het volgende voorbeeld zoekt naar elke vorm van foot (foot, , feetenzovoort) in de Comments kolom van de ProductReview tabel in de AdventureWorks2025 database:
USE AdventureWorks2025;
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 Configureren en beheren woordbrekers en stemmers.
Meer informatie over zoekopdrachten naar 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 verbuigingsvorm van het woord drive. Als verschillende rijen in de tabel de woorden drive, drives, drove, driving, en drivenbevatten, zouden alle in de resultaatset zitten omdat elk van deze inflectioneel kan worden gegenereerd uit het woord drive.
FREETEXT en FREETEXTTABLE zoek standaard naar verbuigingstermen van alle gespecificeerde woorden.
CONTAINS en CONTAINSTABLE ondersteunen een optioneel INFLECTIONAL-argument.
Zoeken naar synoniemen van een specifiek woord
Een synoniemenlijst definieert door de gebruiker opgegeven synoniemen voor termen. Voor meer informatie over thesaurusbestanden, zie Configure and Manage Thesaurus Files for Full-Text Search.
Als bijvoorbeeld een invoer, {car, automobile, truck, van}, aan een thesaurus wordt toegevoegd, kun je zoeken naar de thesaurusvorm van het woord car. Alle rijen in de tabel die de woorden automobile, truck, , vanbevatten, of car in de resultaatset voorkomen omdat elk van deze woorden behoort tot de synoniemuitbreidingsverzameling die het woord carbevat.
FREETEXT
FREETEXTTABLE en gebruik standaard het thesaurus.
CONTAINS en CONTAINSTABLE ondersteunen een optioneel THESAURUS-argument.
Zoek een woord bij 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.
Je wilt bijvoorbeeld de rijen vinden waarin het woord ice dicht bij het woord hockey staat of waarin de uitdrukking ice skating dicht bij de uitdrukking ice hockeyligt.
Voor meer informatie over nabijheidszoekopdrachten, zie Zoeken naar woorden dicht bij een ander woord met NEAR.
Zoek naar woorden of uitdrukkingen met gewogen waarden (gewogen term)
Je kunt het gebruiken CONTAINSTABLE om te zoeken naar woorden of uitdrukkingen 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.
Het volgende voorbeeld toont een zoekopdracht die zoekt naar alle klantadressen, met gewichten, waarbij elke tekst die begint met de string Bay ofwel Street of Viewheeft. De resultaten geven een hogere rang aan die rijen die meer van de gespecificeerde woorden bevatten.
USE AdventureWorks2025;
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 termenzoekopdrachten
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 resultaatsets bevatten documenten of rijen die een van de gespecificeerde termen (of inhoud ertussen bevatten); Sommige resultaten worden echter als relevanter beschouwd dan andere vanwege de variatie in de gewogen waarden die bij verschillende gezochten termen horen.
Gewogen termenzoekopdrachten worden ondersteund door CONTAINSTABLE.
And, OR en NOT (Booleaanse operatoren) gebruiken
Het predicaat en CONTAINS de CONTAINSTABLE functie gebruiken dezelfde zoekvoorwaarden. Beide ondersteunen het combineren van verschillende zoektermen door Booleaanse operatoren (AND, OR, , en NOT) te gebruiken om logische bewerkingen uit te voeren. Je kunt bijvoorbeeld AND gebruiken om rijen te vinden die zowel latte als New York-style bagel bevatten. Je kunt AND NOTbijvoorbeeld gebruiken om de rijen te vinden die wel bevatten bagel maar niet cream cheese.
Daarentegen behandelen FREETEXT en FREETEXTTABLE de Booleaanse termen als zoekwoorden.
Voor informatie over het combineren CONTAINS met andere predicaten die de logische operatoren AND, OR, , en NOTgebruiken, zie Zoekconditie.
Voorbeeld
Het volgende voorbeeld gebruikt het CONTAINS predicaat om te zoeken naar beschrijvingen waarbij de beschrijvings-ID niet gelijk is aan 5 en de beschrijving zowel het woord Aluminum als het woord spindlebevat. De zoekvoorwaarde gebruikt de AND Booleaanse operator. Dit voorbeeld gebruikt de ProductDescription tabel van de AdventureWorks2025 database.
USE AdventureWorks2025;
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 orthografische normalisatie wordt niet ondersteund.
Stopwords. Wanneer je een full-text query definieert, verwijdert de Full-Text Engine stopwords (ook wel ruiswoorden genoemd) uit de zoekcriteria. Stopwoorden zijn woorden zoals
a,and, ,isofthe, die vaak voorkomen maar 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, raadpleeg Stopwoorden en stopwoordenlijsten configureren en beheren voor zoeken in volledige tekst.Taal, met de
LANGUAGEoptie. Veel zoektermen zijn sterk afhankelijk van het gedrag van de woordafbreker. Om zeker te weten dat je de juiste woordbreker (en stemmer) en thesaurusbestand gebruikt, moet je deLANGUAGEoptie specificeren. Voor meer informatie, zie Kies een taal bij het maken van een volledige tekstindex.synoniemenlijst.
FREETEXTenFREETEXTTABLEqueries gebruiken standaard de thesaurus.CONTAINSenCONTAINSTABLEondersteunen een optioneelTHESAURUS-argument. Zie Synoniemenlijstbestanden configureren en beheren voor Full-Text Zoeken voor meer informatie.
De tokenisatieresultaten controleren
Nadat je een bepaalde woordbreker-, thesaurus- en stoplistcombinatie in een query hebt toegepast, kun je zien hoe Full-Text Search de resultaten tokeniseert door gebruik te maken van de sys.dm_fts_parser dynamische beheerweergave. Voor meer informatie, zie sys.dm_fts_parser.
Verwante onderwerpen
- BEVAT (Transact-SQL)
- CONTAINSTABLE (Transact-SQL)
- VRIJTEKST (Transact-SQL)
- VRIJTEKSTTABEL (Transact-SQL)
- Full-Text Search Query's (Visual Database Tools) maken
- Verbeter de prestaties van full-text queries