CONTAINSTABLE (Transact-SQL)
gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance
Returnerar en tabell med noll, en eller flera rader för de kolumner som innehåller exakta eller fuzzy (mindre exakta) matchningar till enkla ord och fraser, närheten till ord inom ett visst avstånd från varandra eller viktade matchningar. CONTAINSTABLE används i FROM-satsen för en Transact-SQL SELECT-instruktion och refereras som om det vore ett vanligt tabellnamn. Den utför en SQL Server-fulltextsökning på fulltextindexerade kolumner som innehåller teckenbaserade datatyper.
CONTAINSTABLE är användbart för samma typer av matchningar som CONTAINS-predikat och använder samma sökvillkor som CONTAINS.
Till skillnad från CONTAINS returnerar dock frågor som använder CONTAINSTABLE ett relevansrankningsvärde (RANK) och fulltextnyckel (NYCKEL) för varje rad. Information om de former av fulltextsökningar som stöds av SQL Server finns i Query with Full-Text Search.
Transact-SQL syntaxkonventioner
Syntax
CONTAINSTABLE
( table , { column_name | ( column_list ) | * } , ' <contains_search_condition> '
[ , LANGUAGE language_term]
[ , top_n_by_rank ]
)
<contains_search_condition> ::=
{ <simple_term>
| <prefix_term>
| <generation_term>
| <generic_proximity_term>
| <custom_proximity_term>
| <weighted_term>
}
| { ( <contains_search_condition> )
{ { AND | & } | { AND NOT | &! } | { OR | | } }
<contains_search_condition> [ ...n ]
}
<simple_term> ::=
{ word | "phrase" }
<prefix term> ::=
{ "word*" | "phrase*" }
<generation_term> ::=
FORMSOF ( { INFLECTIONAL | THESAURUS } , <simple_term> [ ,...n ] )
<generic_proximity_term> ::=
{ <simple_term> | <prefix_term> } { { { NEAR | ~ }
{ <simple_term> | <prefix_term> } } [ ...n ] }
<custom_proximity_term> ::=
NEAR (
{
{ <simple_term> | <prefix_term> } [ ,...n ]
|
( { <simple_term> | <prefix_term> } [ ,...n ] )
[, <maximum_distance> [, <match_order> ] ]
}
)
<maximum_distance> ::= { integer | MAX }
<match_order> ::= { TRUE | FALSE }
<weighted_term> ::=
ISABOUT
( { {
<simple_term>
| <prefix_term>
| <generation_term>
| <proximity_term>
}
[ WEIGHT ( weight_value ) ]
} [ ,...n ]
)
Argument
tabell
Är namnet på en tabell som har indexerats i fulltext.
tabell kan vara ett databasobjekt i en, två, tre eller fyra delar. När du kör frågor mot en vy kan endast en indexerad bastabell i fulltext ingå.
tabell inte kan ange ett servernamn och kan inte användas i frågor mot länkade servrar.
column_name
Är namnet på en eller flera kolumner som indexeras för fulltextsökning. 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 fulltextindexerade kolumner i tabell ska användas för att söka efter det angivna sökvillkoret. Om inte language_term anges måste språket för alla kolumner i tabellen vara detsamma.
SPRÅK language_term
Är det språk vars resurser kommer att användas för ordbrytning, härstamning och synonymord och brusord (eller stoppord) tas bort 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 installerade resurser som motsvarar det språket returnerar SQL Server ett fel. Om du vill använda neutrala språkresurser anger du 0x0 som language_term.
top_n_by_rank
Anger att endast n högst rankade matchningar, i fallande ordning, returneras. Gäller endast när ett heltalsvärde, n, anges. Om top_n_by_rank kombineras med andra parametrar kan frågan returnera färre rader än antalet rader som faktiskt matchar alla predikat.
top_n_by_rank gör att du kan öka frågeprestandan genom att bara återkalla de mest relevanta träffarna.
<contains_search_condition>
Anger den text som ska sökas efter i column_name och villkoren för en matchning. Information om sökvillkor finns i CONTAINS (Transact-SQL).
Anmärkningar
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.
Tabellen som returneras har en kolumn med namnet KEY som innehåller nyckelvärden i fulltext. Varje fulltextindexerad tabell har en kolumn vars värden garanterat är unika, och värdena som returneras i kolumnen KEY är nyckelvärdena i fulltext för de rader som matchar urvalsvillkoren som anges i sökvillkoret innehåller sökvillkor. Egenskapen TableFulltextKeyColumn som hämtats från funktionen OBJECTPROPERTYEX tillhandahåller identiteten för den här unika nyckelkolumnen. Om du vill hämta ID:t för kolumnen som är associerad med fulltextnyckeln för fulltextindexet använder du sys.fulltext_indexes. Mer information finns i sys.fulltext_indexes (Transact-SQL).
Om du vill hämta de rader du vill ha från den ursprungliga tabellen anger du en koppling till CONTAINSTABLE-raderna. Den typiska formen av FROM-satsen för en SELECT-instruktion med CONTAINSTABLE är:
SELECT select_list
FROM table AS FT_TBL INNER JOIN
CONTAINSTABLE(table, column, contains_search_condition) AS KEY_TBL
ON FT_TBL.unique_key_column = KEY_TBL.[KEY];
Tabellen som skapas av CONTAINSTABLE innehåller en kolumn med namnet RANK. Kolumnen RANK är ett värde (från 0 till 1 000) för varje rad som anger hur väl en rad matchade urvalsvillkoren. Det här rankningsvärdet används vanligtvis på något av följande sätt i SELECT-instruktionen:
I ORDER BY-satsen returnerar du de högst rankade raderna som de första raderna i tabellen.
I listan välj för att se det rangordningsvärde som tilldelats varje rad.
Behörigheter
Körbehörigheter är endast tillgängliga för användare med lämpliga SELECT-behörigheter i tabellen eller den refererade tabellens kolumner.
Exempel
A. Enkelt exempel
I följande exempel skapas och fylls en enkel tabell med två kolumner med tre län och färgerna i flaggorna. Den skapar och fyller i en fulltextkatalog och index i tabellen. Sedan visas syntaxen CONTAINSTABLE. Det här exemplet visar hur rankningsvärdet växer högre när sökvärdet uppfylls flera gånger. I den senaste frågan har Tanzania som innehåller både grönt och svart en högre rangordning än Italien som bara innehåller en av de efterfrågade färgerna.
CREATE TABLE Flags (Country nvarchar(30) NOT NULL, FlagColors varchar(200));
CREATE UNIQUE CLUSTERED INDEX FlagKey ON Flags(Country);
INSERT Flags VALUES ('France', 'Blue and White and Red');
INSERT Flags VALUES ('Italy', 'Green and White and Red');
INSERT Flags VALUES ('Tanzania', 'Green and Yellow and Black and Yellow and Blue');
SELECT * FROM Flags;
GO
CREATE FULLTEXT CATALOG TestFTCat;
CREATE FULLTEXT INDEX ON Flags(FlagColors) KEY INDEX FlagKey ON TestFTCat;
GO
SELECT * FROM Flags;
SELECT * FROM CONTAINSTABLE (Flags, FlagColors, 'Green') ORDER BY RANK DESC;
SELECT * FROM CONTAINSTABLE (Flags, FlagColors, 'Green or Black') ORDER BY RANK DESC;
B. Returnerar rankningsvärden
Följande exempel söker efter alla produktnamn som innehåller orden "frame", "wheel" eller "tire" och olika vikter ges till varje ord. För varje returnerad rad som matchar dessa sökvillkor visas matchningens relativa närhet (rangordningsvärde). Dessutom returneras de högst rankade raderna först.
USE AdventureWorks2022;
GO
SELECT FT_TBL.Name, KEY_TBL.RANK
FROM Production.Product AS FT_TBL
INNER JOIN CONTAINSTABLE(Production.Product, Name,
'ISABOUT (frame WEIGHT (.8),
wheel WEIGHT (.4), tire WEIGHT (.2) )' ) AS KEY_TBL
ON FT_TBL.ProductID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
GO
C. Returnerar rankningsvärden som är större än ett angivet värde
gäller för: SQL Server 2012 (11.x) och senare. |
I följande exempel används NEAR för att söka efter "bracket
" och "reflector
" nära varandra i tabellen Production.Document
. Endast rader med rangvärdet 50 eller högre returneras.
USE AdventureWorks2022
GO
SELECT DocumentNode, Title, DocumentSummary
FROM Production.Document AS DocTable
INNER JOIN CONTAINSTABLE(Production.Document, Document,
'NEAR(bracket, reflector)' ) AS KEY_TBL
ON DocTable.DocumentNode = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 50
ORDER BY KEY_TBL.RANK DESC;
GO
Not
Om en fulltextfråga inte anger ett heltal som maximalt avstånd, kommer ett dokument som endast innehåller träffar vars mellanrum är större än 100 logiska termer inte att uppfylla NEAR-kraven och dess rangordning blir 0.
D. Returnerar topp 5-rankade resultat med hjälp av top_n_by_rank
I följande exempel returneras beskrivningen av de 5 främsta produkterna där kolumnen Description
innehåller ordet "aluminium" nära antingen ordet "ljus" eller ordet "lightweight".
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)',
5
) AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY];
GO
GO
E. Ange ARGUMENTET SPRÅK
Följande exempel visar hur du använder argumentet LANGUAGE
.
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)',
LANGUAGE N'English',
5
) AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY];
GO
Not
Argumentet LANGUAGE language_term krävs inte för att använda top_n_by_rank.
Se även
begränsa sökresultat med RANK
fråga med Full-Text Search
Skapa Full-Text sökfrågor (Visual Database Tools)
CONTAINS (Transact-SQL)
fråga med Full-Text Search
SELECT (Transact-SQL)
FRÅN (Transact-SQL)