Fråga med Full-Text Search

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Skriv fulltextsökningar med hjälp av predikaten CONTAINS och FREETEXT samt de radmängdsvärda funktionerna CONTAINSTABLE och FREETEXTTABLE i en SELECT-sats. 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.

  • För att matcha ord och fraser, använd CONTAINS och CONTAINSTABLE.
  • För att matcha betydelsen, men inte exakt formulering, använd FREETEXT och FREETEXTTABLE.

Exempel på varje predikat och funktion

Kodexemplen i den här artikeln använder AdventureWorks2025- eller AdventureWorksDW2025-exempeldatabasen, som du kan ladda ned från startsidan Microsoft SQL Server Samples och Community Projects.

Om du vill köra exempelfrågorna måste du också konfigurera Full-Text Search. För mer information, se Kom 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 AdventureWorks2025;
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 AdventureWorks2025;
GO

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

Exempel: CONTAINSTABLE

Följande exempel återger beskrivnings-ID och beskrivning av alla produkter där kolumnen Description innehåller ordet aluminum nära antingen ordet light eller ordet lightweight. Endast rader med högre rang än 2 returneras.

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

Exempel: FREETEXTTABLE

Följande exempel utökar en FREETEXTTABLE fråga för att först returnera de högst rankade raderna och lägga till rangordningen för varje rad i select-listan. För att skriva en liknande fråga måste du veta att ProductDescriptionID är den unika nyckelkolumnen för tabellen ProductDescription .

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

Här är ett tillägg för samma fråga som bara returnerar rader med rangordningen 10 eller högre:

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

Matcha ord eller matcha betydelse

CONTAINS och CONTAINSTABLE, eller FREETEXT och 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 sökning:

CONTAINS och CONTAINSTABLE

  • Matcha enkla ord och fraser med exakt eller fuzzy (mindre exakt) matchning.
  • Du kan också göra följande:

FRITEXT och FRITEXTTABELL

  • 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

CONTAINS- eller FREETEXT-predikaten och CONTAINSTABLE- eller FREETEXTTABLE-radmängdsvärdesfunktionerna har olika syntax och alternativ. Följande information hjälper dig att välja det bästa predikatet eller funktionen för din sökning:

Predikat CONTAINS och FREETEXT

Användning. Använd fulltextpredikaten CONTAINS och FREETEXT i satsen WHERE eller HAVING i en SELECT-sats.

Resultat. Predikaten CONTAINS och FREETEXT 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 predikaten, såsom 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 fyrdelat namn i predikatet CONTAINS eller FREETEXT för att fråga efter 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.

För mer information om syntaxen och argumenten för dessa predikat, se CONTAINS och FREETEXT.

Funktioner med raduppsättningsvärden CONTAINSTABLE och FREETEXTTABLE

Användning. Använd fulltexten CONTAINSTABLE och FREETEXTTABLE funktionerna som ett vanligt tabellnamn i FROM satsen i ett SELECT uttalande.

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 slå ihop resultaten av CONTAINSTABLE eller FREETEXTTABLE med bastabellen. Om du vill ansluta till tabellerna måste du känna till det unika nyckelkolumnnamnet. Denna kolumn, som förekommer i varje fulltextaktiverad tabell, används för att upprätthålla unika rader för tabellen (kolumnen för unika nyckel). För mer information om nyckelkolumnen, se Skapa och hantera fulltextindex.

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 en av dessa funktioner returnerar också ett relevansrangordningsvärde (RANK) och en fulltextnyckel (KEY) för varje rad som returneras, enligt följande:

  • KEY kolumn. Kolumnen KEY returnerar unika värden för de returnerade raderna. Kolumnen KEY kan användas för att specificera urvalskriterier.

  • RANK kolumn. Kolumnen RANK returnerar ett rangvärde för varje rad som visar hur väl raden matchade urvalskriterierna. 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. För mer information, se Begränsa sökresultat med rankning.

För mer information om syntaxen och argumenten för dessa funktioner, se CONTAINSTABLE och FREETEXTTABLE.

Specifika typer av sökningar

Sök efter ett specifikt ord eller fras (enkel term)

Du kan använda CONTAINS, , , CONTAINSTABLE, eller FREETEXT för att söka i en tabell efter ett specifikt ord FREETEXTTABLEeller fras. Till exempel, om du vill söka i ProductReview tabellen i databasen AdventureWorks2025 för att hitta alla kommentarer om en produkt med frasen learning curve, kan du använda predikatet CONTAINS enligt följande:

USE AdventureWorks2025;
GO

SELECT Comments
FROM Production.ProductReview
WHERE CONTAINS ((Comments), '"learning curve"');
GO

Sökvillkoret, i detta fall learning curve, kan vara komplext och kan bestå av en eller flera termer.

Mer information om enkla ordsö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 croissant är 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 som börjar med ett prefix (prefixterm)

Du kan använda CONTAINS eller CONTAINSTABLE 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. Till exempel, för att söka efter alla rader som innehåller prefixet top-, som i topple, topping, och top, ser frågan ut som följande exempel:

USE AdventureWorks2025;
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 är avgränsade med dubbla citattecken, som i CONTAINS (DESCRIPTION, 'top*'), betraktas inte en fulltextsökning som en joker.

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. Till exempel hittar prefixtermen rader med texten light breaded, lightly breaded eller light bread, men den returnerar inte lightly toasted bread.

Mer information om sökningar efter prefix

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 är varje ord som börjar med den angivna termen en del av resultatmängden. Till exempel matchar auto*termen automatic , automobile, och så vidare.

  • För en fras anses varje ord i frasen vara en prefixterm. Till exempel matchar termen auto tran* och automatic transmission, men den matchar automobile transducerinte .automatic motor transmission

Prefixsökningar stöds av CONTAINS och CONTAINSTABLE.

Sök efter böjningsformer av ett specifikt ord (generationsterm)

Du kan använda CONTAINS, CONTAINSTABLE, FREETEXT, eller FREETEXTTABLE söka efter alla olika tempus och böjningar av ett verb eller både singular- och pluralformer av ett substantiv (en böjningssökning) eller efter synonymformer av ett specifikt ord (en tesaurussökning).

Följande exempel söker efter någon form av foot (foot, feet och så vidare) i kolumnen Comments i tabellen ProductReview i databasen AdventureWorks2025:

USE AdventureWorks2025;
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. För mer information om stemmers, se Konfigurera och hantera ordbrytare och stemmers.

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.

Till exempel, sök efter den böjningsformen av ordet drive. Om olika rader i tabellen innehåller orden drive, drives, drove, driving och driven, skulle alla ingå i resultatuppsättningen eftersom var och en av dessa kan genereras genom böjning från ordet drive.

FREETEXT och FREETEXTTABLE leta efter böjningstermer för alla angivna ord som standard. CONTAINS och CONTAINSTABLE stödja ett valfritt INFLECTIONAL argument.

Sök efter synonymer för ett visst ord

En synonymordlista definierar användarspecifika synonymer för termer. För mer information om tesaurusfiler, se Konfigurera och hantera tesaurusfiler för Full-Text sökning.

Till exempel, om en post, {car, automobile, truck, van}, läggs till i en tesaurus, kan du söka efter tesaurusformen av ordet car. Alla rader i tabellen som söks och som innehåller orden automobile, truck, , vaneller car som förekommer i resultatmängden eftersom vart och ett av dessa ord tillhör synonymexpansionsmängden som innehåller ordet car.

FREETEXT och FREETEXTTABLE använder synonymordboken som standard. CONTAINS och CONTAINSTABLE stödja ett valfritt THESAURUS argument.

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.

Till exempel vill du hitta raderna där ordet ice är nära ordet hockey eller där frasen ice skating är nära frasen ice hockey.

För mer information om närhetssökningar, se 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 den 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.

Följande exempel visar en fråga som söker efter alla kundadresser, med vikter, där varje text som börjar med strängen Bay har antingen Street eller View. Resultaten ger högre rang till de rader som innehåller fler av de angivna orden.

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

En viktad term kan användas tillsammans med valfri enkel term, prefixterm, generationsterm eller närhetsterm.

Mer information om sökningar efter viktade termer

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. Resultatmängderna innehåller dokument eller rader som innehåller någon av de specificerade termerna (eller innehållet mellan dem); dock anses vissa resultat vara mer relevanta än andra på grund av variationen i viktade värden kopplade till olika sökta termer.

Viktade termsökningar stöds av CONTAINSTABLE.

Använd AND, OR och NOT (booleska operatorer)

Predikatet CONTAINS och CONTAINSTABLE funktionen använder samma sökvillkor. Båda stöder att kombinera flera söktermer genom att använda booleska operatorer (AND, OR, och NOT) för att utföra logiska operationer. Du kan använda AND, till exempel, för att hitta rader som innehåller både latte och New York-style bagel. Du kan använda AND NOT, till exempel, för att hitta rader som innehåller bagel men inte innehåller cream cheese.

I kontrast, FREETEXT och FREETEXTTABLE behandla de booleska termerna som ord att söka efter.

För information om att kombinera CONTAINS med andra predikat som använder de logiska operatorerna AND, OR, och NOT, se Sökvillkoret.

Exempel

Följande exempel använder predikatet CONTAINS för att söka efter beskrivningar där beskrivnings-ID inte är lika med 5 och beskrivningen innehåller både ordet Aluminum och ordet spindle. Sökvillkoret använder den AND booleska operatorn. Detta exempel använder ProductDescription databasens tabell AdventureWorks2025 .

USE AdventureWorks2025;
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). Denna typ av ortografisk normalisering stöds inte.

  • Stopwords. När du definierar en fulltextfråga tar Full-Text Engine bort stoppord (även kallade brusord) från sökkriterierna. Stoppord är ord som a, and, is eller the, som ofta förekommer men som vanligtvis inte hjälper vid sökning efter specifik 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. För mer information, se Konfigurera och hantera stoppord och stopplistor för Full-Text Sökning.

  • Språk, med 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 synonymordbok bör du ange alternativet LANGUAGE . För mer information, se Välj ett språk när du skapar ett fulltextindex.

  • Tesaurus. FREETEXT och FREETEXTTABLE frågor använder synonymordboken som standard. CONTAINS och CONTAINSTABLE stödja ett valfritt THESAURUS argument. Mer information finns i Konfigurera och hantera synonymfiler för Full-Text sökning.

Kontrollera tokeniseringsresultatet

Efter att du har tillämpat en given ordbrytare, synonymordbok och stoplist-kombination i en fråga kan du se hur Full-Text Search tokeniserar resultaten genom att använda den dynamiska sys.dm_fts_parser hanteringsvyn. För mer information, se sys.dm_fts_parser.