FREETEXT (Transact-SQL)
gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-databas i Microsoft Fabric
Är ett predikat som används i Transact-SQL WHERE-satsen för en Transact-SQL SELECT-instruktion för att utföra en SQL Server-fulltextsökning på fulltextindexerade kolumner som innehåller teckenbaserade datatyper. Det här predikatet söker efter värden som matchar innebörden och inte bara den exakta formuleringen av orden i sökvillkoret. När FREETEXT används utför frågemotorn i fulltext följande åtgärder internt på freetext_string, tilldelar varje term en vikt och hittar sedan matchningarna:
Avgränsar strängen i enskilda ord baserat på ordgränser (ordbrytning).
Genererar böjliga former av orden (härstamning).
Identifierar en lista över expansioner eller ersättningar för villkoren baserat på matchningar i synonymordlistan.
Not
Information om de former av fulltextsökningar som stöds av SQL Server finns i Query with Full-Text Search.
gäller för: SQL Server (SQL Server 2008 (10.0.x) via aktuella versionen).
Transact-SQL syntaxkonventioner
Syntax
FREETEXT ( { column_name | (column_list) | * }
, 'freetext_string' [ , LANGUAGE language_term ] )
Argument
column_name
Är namnet på en eller flera fulltextindexerade kolumner i tabellen som anges i FROM-satsen. Kolumnerna kan vara av typen
column_list
Anger att flera kolumner, avgränsade med ett kommatecken, kan anges.
column_list måste omges av parenteser. Om inte language_term anges måste språket för alla kolumner i column_list vara detsamma.
*
Anger att alla kolumner som har registrerats för fulltextsökning ska användas för att söka efter den angivna freetext_string. Om mer än en tabell finns i FROM-satsen måste * kvalificeras med tabellnamnet. Om inte language_term anges måste språket för alla kolumner i tabellen vara detsamma.
freetext_string
Är text att söka efter i column_name. All text, inklusive ord, fraser eller meningar, kan anges. Matchningar genereras om någon term eller formerna för någon term hittas i fulltextindexet.
Till skillnad från i sökvillkoret CONTAINS och CONTAINSTABLE där AND är ett nyckelord betraktas ordet "och" som ett brusord när det används i freetext_string, eller stoppordoch ignoreras.
Användning av WEIGHT, FORMSOF, jokertecken, NEAR och annan syntax tillåts inte. freetext_string är ordbrokad, stemmed och passerade genom synonymordlistan.
freetext_string är nvarchar. En implicit konvertering sker när en annan teckendatatyp används som indata. Det går inte att använda stora strängdatatyper nvarchar(max) och varchar(max). I följande exempel orsakar variabeln @SearchWord
, som definieras som varchar(30)
, en implicit konvertering i FREETEXT
predikatet.
USE AdventureWorks2022;
GO
DECLARE @SearchWord VARCHAR(30)
SET @SearchWord ='performance'
SELECT Description
FROM Production.ProductDescription
WHERE FREETEXT(Description, @SearchWord);
Eftersom "parametersniffning" inte fungerar över konverteringen använder du nvarchar för bättre prestanda. I exemplet deklarerar du @SearchWord
som nvarchar(30)
.
USE AdventureWorks2022;
GO
DECLARE @SearchWord NVARCHAR(30)
SET @SearchWord = N'performance'
SELECT Description
FROM Production.ProductDescription
WHERE FREETEXT(Description, @SearchWord);
Du kan också använda frågetipset OPTIMERA FÖR för fall där en icke-optimal plan genereras.
SPRÅK language_term
Är det språk vars resurser kommer att användas för ordbrytning, härstamning och synonymordsborttagning som en del av frågan. Den här parametern är valfri och kan anges som ett sträng-, heltals- eller hexadecimalt värde som motsvarar språkidentifieraren (LCID). Om language_term anges tillämpas det språk som det representerar på alla element i sökvillkoret. Om inget värde anges används kolumnens fulltextspråk.
Om dokument med olika språk lagras tillsammans som binära stora objekt (BLOB) i en enda kolumn, avgör språkidentifieraren (LCID) för ett visst dokument vilket språk som används för att indexera innehållet. När du kör frågor mot en sådan kolumn kan det öka sannolikheten för en bra matchning om du anger LANGUAGE language_term.
När language_term anges som en sträng motsvarar det aliaset kolumnvärdet i sys.syslanguages kompatibilitetsvyn. Strängen måste omges av enkla citattecken, som i "language_term". När det anges som ett heltal är language_term den faktiska LCID som identifierar språket. När det anges som ett hexadecimalt värde är language_term 0x följt av hexadecimalt värde för LCID. Hexadecimalt värde får inte överstiga åtta siffror, inklusive inledande nollor.
Om värdet är i DBCS-format (double-byte character set) konverterar Microsoft SQL Server det till Unicode.
Om det angivna språket inte är giltigt eller om det inte finns några resurser installerade som motsvarar det språket returnerar Microsoft SQL Server ett fel. Om du vill använda neutrala språkresurser anger du 0x0 som language_term.
Allmänna kommentarer
Fulltextpredikat och funktioner fungerar på en enda tabell, vilket är underförstått i FROM-predikatet. Om du vill söka i flera tabeller använder du en ansluten tabell i FROM-satsen för att söka efter en resultatuppsättning som är produkten av två eller flera tabeller.
Fulltextfrågor som använder FREETEXT är mindre exakta än de fulltextfrågor som använder CONTAINS. Sql Server-sökmotorn i fulltext identifierar viktiga ord och fraser. Ingen särskild betydelse ges till något av de reserverade nyckelorden eller jokertecken som vanligtvis har betydelse när de anges i parametern <contains_search_condition> i CONTAINS-predikatet.
Fulltextpredikat tillåts inte i OUTPUT-satsen när databaskompatibilitetsnivån är inställd på 100.
Not
Funktionen FREETEXTTABLE är användbar för samma typer av matchningar som FREETEXT-predikatet. Du kan referera till den här funktionen som ett vanligt tabellnamn i FROM-satsen för en SELECT-instruktion. Mer information finns i FREETEXTTABLE (Transact-SQL).
Köra frågor mot fjärrservrar
Du kan använda ett namn i fyra delar i CONTAINS- eller FREETEXT-predikat för att fråga fulltextindexerade kolumner i måltabellerna på en länkad server. Om du vill förbereda en fjärrserver för att ta emot fulltextfrågor skapar du ett fulltextindex för måltabellerna och kolumnerna på fjärrservern och lägger sedan till fjärrservern som en länkad server.
Jämförelse av LIKE till Full-Text Search
Till skillnad från fulltextsökning fungerar LIKETransact-SQL predikat endast på teckenmönster. Du kan inte heller använda LIKE-predikatet för att fråga efter formaterade binära data. Dessutom är en LIKE-fråga mot en stor mängd ostrukturerade textdata mycket långsammare än en motsvarande fulltextfråga mot samma data. Det kan ta några minuter att returnera en LIKE-fråga mot miljontals rader med textdata. Medan en fulltextfråga bara kan ta sekunder eller mindre mot samma data, beroende på antalet rader som returneras.
Exempel
A. Använda FREETEXT för att söka efter ord som innehåller angivna teckenvärden
Följande exempel söker efter alla dokument som innehåller ord som rör viktiga komponenter, säkerhet och komponenter.
USE AdventureWorks2022;
GO
SELECT Title
FROM Production.Document
WHERE FREETEXT (Document, 'vital safety components' );
GO
B. Använda FREETEXT med variabler
I följande exempel används en variabel i stället för en specifik söktermen.
USE AdventureWorks2022;
GO
DECLARE @SearchWord NVARCHAR(30);
SET @SearchWord = N'high-performance';
SELECT Description
FROM Production.ProductDescription
WHERE FREETEXT(Description, @SearchWord);
GO
Se även
Kom igång med Full-Text Search
Skapa och hantera Full-Text kataloger
SKAPA FULLTEXTKATALOG (Transact-SQL)
SKAPA FULLTEXTINDEX (Transact-SQL)
Skapa och hantera Full-Text index
fråga med Full-Text Search
Skapa Full-Text sökfrågor (Visual Database Tools)
CONTAINS (Transact-SQL)
CONTAINSTABLE (Transact-SQL)
datatyper (Transact-SQL)
FREETEXTTABLE (Transact-SQL)
WHERE (Transact-SQL)