Fråga med Full-Text Sök
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Skriv fulltextfrågor med hjälp av predikaten CONTAINS och FREETEXT och rowset-värdefunktionerna CONTAINSTABLE och FREETEXTTABLE med en SELECT-instruktion. Den här artikeln innehåller exempel på varje predikat och funktion och hjälper dig att välja den bästa att använda.
- Om du vill matcha ord och fraser använder du CONTAINS och CONTAINSTABLE.
- Om du vill matcha innebörden, men inte den exakta formuleringen, använder du FREETEXT och FREETEXTTABLE.
Exempel på varje predikat och funktion
I följande exempel används exempeldatabasen AdventureWorks. Den slutliga versionen av AdventureWorks finns i AdventureWorks Databases and Scripts for SQL Server 2016 CTP3. Om du vill köra exempelfrågorna måste du också konfigurera Full-Text Search. Mer information finns i Komma igång med Full-Text Sök.
Exempel – CONTAINS
I följande exempel hittas alla produkter med priset $80.99
som innehåller ordet "Mountain"
:
USE AdventureWorks2022
GO
SELECT Name, ListPrice
FROM Production.Product
WHERE ListPrice = 80.99
AND CONTAINS(Name, 'Mountain')
GO
Exempel – FRITEXT
Följande exempel söker efter alla dokument som innehåller ord relaterade till vital safety components
:
USE AdventureWorks2022
GO
SELECT Title
FROM Production.Document
WHERE FREETEXT (Document, 'vital safety components')
GO
Exempel – CONTAINSTABLE
I följande exempel returneras beskrivnings-ID och beskrivning av alla produkter för vilka kolumnen Description innehåller ordet "aluminium" nära antingen ordet "ljus" eller ordet "lightweight". Endast rader med rangordningen 2 eller högre returneras.
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
Exempel – FREETEXTTABLE
I följande exempel utökas en FREETEXTTABLE-fråga för att returnera de högst rankade raderna först och för att lägga till rangordningen för varje rad i urvalslistan. Om du vill skriva en liknande fråga måste du veta att ProductDescriptionID är den unika nyckelkolumnen för tabellen 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
Här är ett tillägg för samma fråga som bara returnerar rader med rangordningen 10 eller högre:
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
Matcha ord eller matcha betydelse
CONTAINS
/
CONTAINSTABLE
och FREETEXT
/FREETEXTTABLE
är användbara för olika typer av matchning. Följande information hjälper dig att välja det bästa predikatet eller funktionen för din fråga:
CONTAINS/CONTAINSTABLE
- Matcha enkla ord och fraser med exakt eller fuzzy (mindre exakt) matchning.
- Du kan också göra följande:
- Ange närheten till ord inom ett visst avstånd från varandra.
- Returnera viktade matchningar.
- Kombinera sökvillkor med logiska operatorer. Mer information finns i Använda booleska operatorer (AND, OR och NOT) senare i den här artikeln.
FREETEXT/FREETEXTTABLE
- Matcha innebörden, men inte den exakta formuleringen, för angivna ord, fraser eller meningar (den fritextsträngen).
- Matchningar genereras om någon term eller form av någon term hittas i fulltextindexet för en angiven kolumn.
Jämföra predikat och funktioner
Predikaten CONTAINS
/FREETEXT
och raduppsättningsvärdesfunktionerna CONTAINSTABLE
/FREETEXTTABLE
ha olika syntax och alternativ. Följande information hjälper dig att välja det bästa predikatet eller funktionen för din fråga:
Predikat CONTAINS och FREETEXT
Användning. Använd fulltext-predikaten CONTAINS och FREETEXT i WHERE- eller HAVING-klausulerna i en SELECT-sats.
Resultat. CONTAINS- och FREETEXT-predikaten returnerar ett TRUE- eller FALSE-värde som anger om en viss rad matchar fulltextfrågan. Matchande rader returneras i resultatsättet.
Fler alternativ. Du kan kombinera predikaten med någon av de andra Transact-SQL predikat, till exempel LIKE och BETWEEN.
Du kan ange antingen en enskild kolumn, en lista med kolumner eller alla kolumner i tabellen som ska sökas igenom.
Du kan också ange det språk vars resurser används av fulltextfrågan för ordbrytning och ordseparering, synonymordssökningar och borttagning av brusord.
Du kan använda ett namn i fyra delar i predikatet CONTAINS eller FREETEXT för att köra frågor mot indexerade fulltextkolumner 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.
Mer information. Mer information om syntaxen och argumenten för dessa predikat finns i CONTAINS och FREETEXT.
Funktioner med raduppsättningsvärden CONTAINSTABLE och FREETEXTTABLE
Användning. Använd fulltextfunktionerna CONTAINSTABLE- och FREETEXTTABLE-funktioner som ett vanligt tabellnamn i FROM-satsen i en SELECT-instruktion.
Du måste ange vilken bastabell som ska genomsökas när du använder någon av dessa funktioner. Precis som med predikaten kan du ange en enda kolumn, en lista med kolumner eller alla kolumner i tabellen som ska sökas igenom och eventuellt det språk vars resurser används av en viss fulltextfråga.
Vanligtvis måste du koppla resultaten från CONTAINSTABLE eller FREETEXTTABLE med bastabellen. Om du vill ansluta till tabellerna måste du känna till det unika nyckelkolumnnamnet. Den här kolumnen, som inträffar i varje fulltextaktiverad tabell, används för att framtvinga unika rader för tabellen (den unika**nyckelkolumnen). Mer information om nyckelkolumnen finns i Skapa och hantera Full-Text index.
Resultat. Dessa funktioner returnerar en tabell med noll, en eller flera rader som matchar fulltextfrågan. Den returnerade tabellen innehåller endast rader från bastabellen som matchar urvalsvillkoren som anges i funktionens villkor för fulltextsökning.
Frågor som använder någon av dessa funktioner returnerar också ett värde för relevansrankning (RANK) och fulltextnyckel (KEY) för varje rad som returneras enligt följande:
- nyckel kolumn. Kolumnen KEY returnerar unika värden för de returnerade raderna. Kolumnen KEY kan användas för att ange urvalsvillkor.
- RANK-kolumn. Kolumnen RANK returnerar ett rankningsvärde för varje rad som anger hur väl raden matchade urvalsvillkoren. Ju högre rangvärde för texten eller dokumentet på en rad, desto mer relevant är raden för den angivna fulltextfrågan. Olika rader kan rangordnas identiskt. Du kan begränsa antalet matchningar som ska returneras genom att ange den valfria top_n_by_rank parametern. Mer information finns i Begränsa sökresultat med RANK.
Mer information. Mer information om syntaxen och argumenten för dessa funktioner finns i CONTAINSTABLE och FREETEXTTABLE.
Specifika typer av sökningar
Sök efter ett specifikt ord eller en fras (enkel term)
Du kan använda CONTAINS, CONTAINSTABLE, FREETEXTeller FREETEXTTABLE för att söka efter ett visst ord eller en viss fras i en tabell. Om du till exempel vill söka i tabellen ProductReview i AdventureWorks2022
-databasen för att hitta alla kommentarer om en produkt med frasen "inlärningskurva" kan du använda CONTAINS-predikatet på följande sätt:
USE AdventureWorks2022
GO
SELECT Comments
FROM Production.ProductReview
WHERE CONTAINS(Comments, '"learning curve"')
GO
Sökvillkoret, i det här fallet "inlärningskurva", kan vara komplext och kan bestå av en eller flera termer.
Mer information om enkla termsökningar
I fulltextsökning är ett ord (eller token) en sträng vars gränser identifieras av lämpliga ordbrytare, enligt språkreglerna för det angivna språket. En giltig fras består av flera ord, med eller utan skiljetecken mellan dem.
Till exempel är "croissant" ett ord, och "café au lait" är en fras. Ord och fraser som dessa kallas enkla termer.
CONTAINS och CONTAINSTABLE leta efter en exakt matchning för frasen. FREETEXT och FREETEXTTABLE delar upp frasen i separata ord.
Sök efter ett ord med ett prefix (Prefixterm)
Du kan använda CONTAINS- eller CONTAINSTABLE- för att söka efter ord eller fraser med ett angivet prefix. Alla poster i kolumnen som innehåller text som börjar med det angivna prefixet returneras. Om du till exempel vill söka efter alla rader som innehåller prefixet top
– som i top``ple
, top``ping
och top
. Frågan ser ut som i följande exempel:
USE AdventureWorks2022
GO
SELECT Description, ProductDescriptionID
FROM Production.ProductDescription
WHERE CONTAINS (Description, '"top*"' )
GO
All text som matchar den text som angetts innan asterisken (*) returneras. Om texten och asterisken inte avgränsas med dubbla citattecken, som i CONTAINS (DESCRIPTION, 'top*')
, anser fulltextsökningen inte att asterisken är ett jokertecken..
När prefixtermen är en fras betraktas varje token som utgör frasen som en separat prefixterm. Alla rader som har ord som börjar med prefixtermerna returneras. Prefixet "ljust bröd*" hittar till exempel rader med text av "ljusbröd", "lätt panerat" eller "lätt bröd", men det returnerar inte "lätt rostat bröd".
Mer information om prefixsökningar
En prefix term avser en sträng som fästs i början av ett ord för att bilda ett härlett ord eller en böjningsform.
För en enda prefixterm ingår alla ord som börjar med den angivna termen i resultatuppsättningen. Termen "auto*" matchar till exempel "automatisk", "bil" och så vidare.
För en fras anses varje ord i frasen vara en prefixterm. Termen "auto tran*" matchar till exempel "automatisk växellåda" och "biltransduktor", men den matchar inte "automatisk motoröverföring".
Prefixsökningar stöds av CONTAINS- och CONTAINSTABLE-.
Sök efter böjliga former av ett visst ord (generationsterm)
Du kan använda CONTAINS, CONTAINSTABLE, FREETEXTeller FREETEXTTABLE för att söka efter alla olika tempora och konjugationer av ett verb eller både singular- och pluralformerna av ett substantiv (en böjningssökning) eller för synonyma former av ett visst ord (en synonymsökning).
I följande exempel söker du efter någon form av "fot" ("fot", "fötter" och så vidare) i kolumnen Comments
i tabellen ProductReview
i databasen AdventureWorks
:
USE AdventureWorks2022
GO
SELECT Comments, ReviewerName
FROM Production.ProductReview
WHERE CONTAINS (Comments, 'FORMSOF(INFLECTIONAL, "foot")')
GO
Fulltextsökning använder stemmers, som gör att du kan söka efter olika tempus och konjugering av ett verb, eller både singular- och pluralformerna i ett substantiv. Mer information om stammare finns i Konfigurera och hantera ordavbrytare och stammare för sökning.
Mer information om generationstermsökningar
De böjliga formerna är de olika tempusen och konjugationerna av ett verb eller singular- och pluralformerna av ett substantiv.
Du kan till exempel söka efter böjningsformen av ordet "drive". Om olika rader i tabellen innehåller orden "drive", "drives", "drove", "driving" och "driven" skulle alla finnas i resultatuppsättningen eftersom var och en av dessa kan genereras böjligt från ordet drive.
FREETEXT och FREETEXTTABLE leta efter böjningsformer av alla angivna ord som standardinställning.
CONTAINS och CONTAINSTABLE stöder ett valfritt INFLECTIONAL
argument.
Sök efter synonymer för ett visst ord
En synonymordlista definierar användarspecifika synonymer för termer. Mer information om synonymfiler finns i Konfigurera och hantera Synonymfiler för Full-Text Search.
Om till exempel en post, "{car, automobile, truck, van}", läggs till i en synonymordlista, kan du söka efter synonymordlistans form av ordet "bil". Alla rader i tabellen som efterfrågas som innehåller orden "automobile", "truck", "van" eller "car" visas i resultatuppsättningen eftersom vart och ett av dessa ord tillhör synonymexpansionsuppsättningen som innehåller ordet "bil".
FREETEXT och FREETEXTTABLE använder synonymordlistan som standard.
CONTAINS och CONTAINSTABLE stödjer ett valfritt argument THESAURUS
.
Sök efter ett ord NÄRA ett annat ord
En närhetsterm anger ord eller fraser som är nära varandra. Du kan också ange det maximala antalet icke-söktermer som avgränsar de första och sista sökorden. Dessutom kan du söka efter ord eller fraser i valfri ordning, eller i den ordning du anger dem.
Du vill till exempel hitta raderna där ordet "is" ligger nära ordet "hockey" eller där frasen "skridskoåkning" ligger nära frasen "ishockey".
Mer information om närhetssökningar finns i Sök efter ord nära ett annat ord med NEAR.
Sök efter ord eller fraser med viktade värden (viktad term)
Du kan använda CONTAINSTABLE- för att söka efter ord eller fraser och ange ett viktningsvärde. Vikt, mätt som ett tal från 0,0 till 1,0, anger vikten av varje ord och fras inom en uppsättning ord och fraser. En vikt på 0,0 är den lägsta och en vikt på 1,0 är den högsta.
I följande exempel visas en fråga som söker efter alla kundadresser, med hjälp av vikter, där all text som börjar med strängen "Bay" har antingen "Street" eller "View". Resultatet ger en högre rangordning till de rader som innehåller fler av de angivna orden.
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
En viktad term kan användas tillsammans med valfri enkel term, prefixterm, generationsterm eller närhetsterm.
Mer information om viktade termsökningar
I en viktad termsökning anger ett viktningsvärde graden av betydelse för varje ord och fras inom en uppsättning ord och fraser. Ett viktvärde på 0,0 är det lägsta och ett viktvärde på 1,0 är det högsta.
I en fråga som söker efter flera termer kan du till exempel tilldela varje sökord ett viktvärde som anger dess betydelse i förhållande till de andra orden i sökvillkoret. Resultatet för den här typen av fråga returnerar de mest relevanta raderna först, beroende på den relativa vikt som du har tilldelat sökord. Resultatuppsättningarna innehåller dokument eller rader som innehåller något av de angivna termerna (eller innehållet mellan dem). Vissa resultat anses dock vara mer relevanta än andra på grund av variationen i de viktade värden som är associerade med olika söktermer.
Viktade termsökningar stöds av CONTAINSTABLE-.
Använd AND, OR och NOT (booleska operatorer)
Funktionen CONTAINS-predikat och CONTAINSTABLE använder samma sökvillkor. Båda har stöd för att kombinera flera söktermer med hjälp av booleska operatorer – AND, OR och NOT – för att utföra logiska åtgärder. Du kan till exempel använda AND för att hitta rader som innehåller både "latte" och "Bagel i New York-stil". Du kan till exempel använda OCH INTE för att hitta de rader som innehåller "bagel" men som inte innehåller "gräddost".
Däremot behandlar FREETEXT och FREETEXTTABLE de booleska termerna som ord som ska sökas igenom.
Information om hur du kombinerar CONTAINS med andra predikat som använder de logiska operatorerna AND, OR och NOT finns i Search Condition (Transact-SQL).
Exempel
I följande exempel används CONTAINS-predikatet för att söka efter beskrivningar där beskrivnings-ID:t inte är lika med 5 och beskrivningen innehåller både ordet "Aluminium" och ordet "spindel". Sökvillkoret använder den booleska operatorn AND. I det här exemplet används tabellen ProductDescription för AdventureWorks2022
-databasen.
USE AdventureWorks2022
GO
SELECT Description
FROM Production.ProductDescription
WHERE ProductDescriptionID <> 5 AND
CONTAINS(Description, 'aluminum AND spindle')
GO
Versaler och gemener, stoppord, språk och synonymordbok
När du skriver fulltextfrågor kan du också ange följande alternativ:
Skiftlägeskänslighet. Fulltextsökningsfrågor är skiftlägesokänsliga. Men på japanska finns det flera fonetiska ortografier där begreppet ortografisk normalisering liknar fallokänslighet (till exempel kana = okänslighet). Den här typen av ortografisk normalisering stöds inte.
Stopwords. När du definierar en fulltextfråga tar Full-Text Engine bort stoppord (kallas även brusord) från sökvillkoren. Stoppord är ord som "a", "och", "är" eller "den", som kan förekomma ofta, men som vanligtvis inte hjälper när du söker efter viss text. Stopord listas i en stopplista. Varje fulltextindex är associerat med en specifik stopplista som avgör vilka stoppord som utelämnas från frågan eller indexet vid indexeringstiden. Mer information finns i Konfigurera och hantera stoppord och stopplistor för Full-Text Search.
Languagemed alternativet LANGUAGE. Många frågetermer är starkt beroende av ordbrytarbeteende. För att säkerställa att du använder rätt ordbrytare (och stemmer) och synonymfil rekommenderar vi att du anger alternativet SPRÅK. Mer information finns i Välj ett språk när du skapar ett Full-Text Index.
Tesaurus. FREETEXT- och FREETEXTTABLE-frågor använder synonymordlistan som standard. CONTAINS och CONTAINSTABLE stöder ett valfritt THESAURUS-argument. Mer information finns i Konfigurera och hantera synonymfiler för Full-Text Search.
Kontrollera tokeniseringsresultatet
När du har tillämpat en viss ordbrytare, synonymordlista och stopplistekombination i en fråga kan du se hur Full-Text Search tokeniserar resultatet med hjälp av sys.dm_fts_parser den dynamiska hanteringsvyn. Mer information finns i sys.dm_fts_parser (Transact-SQL).
Se även
INNEHÅLLER (Transact-SQL)
CONTAINSTABLE (Transact-SQL)
FRITEXT (Transact-SQL)
FREETEXTTABLE (Transact-SQL)
Skapa Full-Text sökfrågor (Visual Database Tools)
Förbättra prestanda för Full-Text frågor