Delen via


FREETEXT (Transact-SQL)

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-database in Microsoft Fabric

Is een predicaat dat wordt gebruikt in de Transact-SQL WHERE-component van een Transact-SQL SELECT-instructie om een zoekopdracht in volledige tekst uit te voeren op geïndexeerde kolommen met op tekens gebaseerde gegevenstypen. Dit predicaat zoekt naar waarden die overeenkomen met de betekenis en niet alleen de exacte formulering van de woorden in de zoekvoorwaarde. Wanneer FREETEXT wordt gebruikt, voert de query-engine voor volledige tekst intern de volgende acties uit op de freetext_string, wijst elke term een gewicht toe en vindt u vervolgens de overeenkomsten:

  • Scheidt de tekenreeks in afzonderlijke woorden op basis van woordgrenzen (woordbrekend).

  • Genereert inflectionele vormen van de woorden (stemming).

  • Identificeert een lijst met uitbreidingen of vervangingen voor de termen op basis van overeenkomsten in de synoniemenlijst.

Notitie

Zie Query met Full-Text Searchvoor informatie over de vormen van zoekopdrachten in volledige tekst die worden ondersteund door SQL Server.

van toepassing op: SQL Server (SQL Server 2008 (10.0.x) tot huidige versie).

Transact-SQL syntaxisconventies

Syntaxis

FREETEXT ( { column_name | (column_list) | * }   
          , 'freetext_string' [ , LANGUAGE language_term ] )  

Argumenten

column_name
Is de naam van een of meer geïndexeerde kolommen in volledige tekst van de tabel die zijn opgegeven in de FROM-component. De kolommen kunnen van het type teken, varchar, nchar, nvarchar, tekst, , ntext, afbeelding, xml-, varbinaireof varbinary(max).

column_list
Geeft aan dat meerdere kolommen, gescheiden door een komma, kunnen worden opgegeven. column_list moet tussen haakjes staan. Tenzij language_term is opgegeven, moet de taal van alle kolommen van column_list hetzelfde zijn.

*
Hiermee geeft u op dat alle kolommen die zijn geregistreerd voor zoeken in volledige tekst moeten worden gebruikt om te zoeken naar de opgegeven freetext_string. Als er meer dan één tabel in de FROM-component staat, moet * worden gekwalificeerd door de tabelnaam. Tenzij language_term is opgegeven, moet de taal van alle kolommen van de tabel hetzelfde zijn.

freetext_string
Is tekst die moet worden gezocht in de column_name. Alle tekst, inclusief woorden, woordgroepen of zinnen, kan worden ingevoerd. Overeenkomsten worden gegenereerd als een term of de vormen van een term worden gevonden in de volledige-tekstindex.

In tegenstelling tot in de zoekvoorwaarde CONTAINS en CONTAINSTABLE waarbij AND een trefwoord is, wordt het woord 'en' beschouwd freetext_string als een ruiswoord of stopwoord, en wordt verwijderd.

Het gebruik van GEWICHT, FORMSOF, jokertekens, NEAR en andere syntaxis is niet toegestaan. freetext_string is woordgebroken, gestamd en doorgegeven door de synoniemenlijst.

freetext_string is nvarchar-. Een impliciete conversie vindt plaats wanneer een ander tekengegevenstype wordt gebruikt als invoer. Grote tekenreeksgegevenstypen nvarchar(max) en varchar(max) kunnen niet worden gebruikt. In het volgende voorbeeld veroorzaakt de @SearchWord variabele, die is gedefinieerd als varchar(30), een impliciete conversie in het predicaat FREETEXT.

USE AdventureWorks2022;  
GO  
DECLARE @SearchWord VARCHAR(30)  
SET @SearchWord ='performance'  
SELECT Description   
FROM Production.ProductDescription   
WHERE FREETEXT(Description, @SearchWord);  
  

Omdat 'parameter-sniffing' niet werkt voor conversie, gebruikt u nvarchar- voor betere prestaties. Declareer in het voorbeeld @SearchWord als nvarchar(30).

USE AdventureWorks2022;  
GO  
DECLARE @SearchWord NVARCHAR(30)  
SET @SearchWord = N'performance'  
SELECT Description   
FROM Production.ProductDescription   
WHERE FREETEXT(Description, @SearchWord);  
  

U kunt ook de hint OPTIMIZE FOR-query gebruiken voor gevallen waarin een niet-geoptimaliseerd plan wordt gegenereerd.

LANGUAGE language_term
Is de taal waarvan de resources worden gebruikt voor woordbreking, stemming en synoniemenlijst en stopwoordverwijdering als onderdeel van de query. Deze parameter is optioneel en kan worden opgegeven als een tekenreeks, geheel getal of hexadecimale waarde die overeenkomt met de landinstellings-id (LCID) van een taal. Als language_term is opgegeven, wordt de taal die deze vertegenwoordigt toegepast op alle elementen van de zoekvoorwaarde. Als er geen waarde is opgegeven, wordt de volledige teksttaal van de kolom gebruikt.

Als documenten van verschillende talen samen worden opgeslagen als binaire grote objecten (BLOBs) in één kolom, bepaalt de landinstellings-id (LCID) van een bepaald document welke taal wordt gebruikt om de inhoud te indexeren. Bij het uitvoeren van query's op een dergelijke kolom kan het opgeven van LANGUAGE language_term de kans op een goede overeenkomst verhogen.

Wanneer deze is opgegeven als een tekenreeks, komt language_term overeen met de alias kolomwaarde in de sys.syslanguages compatibiliteitsweergave. De tekenreeks moet tussen enkele aanhalingstekens staan, zoals in 'language_term'. Wanneer dit is opgegeven als een geheel getal, is language_term de werkelijke LCID die de taal identificeert. Wanneer deze waarde is opgegeven als een hexadecimale waarde, wordt language_term 0x gevolgd door de hexadecimale waarde van de LCID. De hexadecimale waarde mag niet groter zijn dan acht cijfers, inclusief voorloopnullen.

Als de waarde de DBCS-indeling (Double-Byte Character Set) heeft, wordt deze door Microsoft SQL Server geconverteerd naar Unicode.

Als de opgegeven taal niet geldig is of er geen resources zijn geïnstalleerd die overeenkomen met die taal, retourneert Microsoft SQL Server een fout. Als u de neutrale taalbronnen wilt gebruiken, geeft u 0x0 op als language_term.

Algemene opmerkingen

Predicaten en functies in volledige tekst werken in één tabel, die wordt geïmpliceerd in het predicaat FROM. Als u in meerdere tabellen wilt zoeken, gebruikt u een gekoppelde tabel in uw FROM-component om te zoeken naar een resultatenset die het product is van twee of meer tabellen.

Query's met volledige tekst met BEHULP van FREETEXT zijn minder nauwkeurig dan die query's met volledige tekst met CONTAINS. De zoekprogramma voor volledige tekst van SQL Server identificeert belangrijke woorden en woordgroepen. Er wordt geen speciale betekenis gegeven aan een van de gereserveerde trefwoorden of jokertekens die doorgaans betekenis hebben wanneer deze zijn opgegeven in de parameter <contains_search_condition> van het predicaat CONTAINS.

Predicaten voor volledige tekst zijn niet toegestaan in de OUTPUT-component wanneer het compatibiliteitsniveau van de database is ingesteld op 100.

Notitie

De functie FREETEXTTABLE is handig voor dezelfde soorten overeenkomsten als het predicaat FREETEXT. U kunt naar deze functie verwijzen als een gewone tabelnaam in de FROM-component van een SELECT-instructie. Zie FREETEXTTABLE (Transact-SQL)voor meer informatie.

Query's uitvoeren op externe servers

U kunt een vierdelige naam in de CONTAINS of FREETEXT predicaat 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.

In tegenstelling tot zoeken in volledige tekst werkt de predicaat LIKETransact-SQL predicaat alleen op tekenpatronen. U kunt het predicaat LIKE ook niet gebruiken om opgemaakte binaire gegevens op te vragen. Bovendien is een LIKE-query voor een grote hoeveelheid ongestructureerde tekstgegevens veel trager dan een equivalente volledige-tekstquery voor dezelfde gegevens. Het kan enkele minuten duren voordat een LIKE-query wordt uitgevoerd op miljoenen rijen met tekstgegevens; terwijl een volledige-tekstquery slechts enkele seconden of minder kan duren voor dezelfde gegevens, afhankelijk van het aantal rijen dat wordt geretourneerd.

Voorbeelden

Een. FREETEXT gebruiken om te zoeken naar woorden met opgegeven tekenwaarden

In het volgende voorbeeld wordt gezocht naar alle documenten met de woorden met betrekking tot vitale, veiligheid, onderdelen.

USE AdventureWorks2022;  
GO  
SELECT Title  
FROM Production.Document  
WHERE FREETEXT (Document, 'vital safety components' );  
GO  

B. FREETEXT gebruiken met variabelen

In het volgende voorbeeld wordt een variabele gebruikt in plaats van een specifieke zoekterm.

USE AdventureWorks2022;  
GO  
DECLARE @SearchWord NVARCHAR(30);  
SET @SearchWord = N'high-performance';  
SELECT Description   
FROM Production.ProductDescription   
WHERE FREETEXT(Description, @SearchWord);  
GO  

Zie ook

Aan de slag met Full-Text Search-
Full-Text catalogi maken en beheren
FULLTEXT CATALOG (Transact-SQL) maken
FULLTEXT INDEX (Transact-SQL) maken
Full-Text indexen maken en beheren
query uitvoeren met Full-Text
Full-Text Search Query's (Visual Database Tools) maken
BEVAT (Transact-SQL)
CONTAINSTABLE (Transact-SQL)
gegevenstypen (Transact-SQL)
FREETEXTTABLE (Transact-SQL)
WHERE (Transact-SQL)