Dela via


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 i en Transact-SQL-instruktion SELECT 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 och använder samma sökvillkor som CONTAINS.

Till skillnad från CONTAINSreturnerar dock frågor som använder CONTAINSTABLE ett relevansrankningsvärde (RANK) och fulltextnyckel (KEY) 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

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 fulltextindexerad bastabell ingå.

tabellen kan inte ange ett servernamn och kan inte användas i frågor mot länkade servrar.

column_name

Namnet på en eller flera kolumner som indexeras för fulltextsökning. Kolumnerna kan vara av typen char, varchar, nchar, nvarchar, text,,ntext, image, xml, varbinaryeller varbinary(max).

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

Det språk vars resurser används för ordbrytning, härstamning och synonymord och borttagning av brusord (eller stoppord) 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 anger du LANGUAGE <language_term> för att öka sannolikheten för en bra matchning.

När det anges som en sträng motsvarar aliaslanguage_term kolumnvärdet i kompatibilitetsvyn sys.syslanguages. 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 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.

Anmärkningar

Fulltextpredikat och funktioner fungerar på en enda tabell, vilket är underförstått i predikatet FROM . 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 är nyckelvärdena i KEY fulltext för de rader som matchar urvalsvillkoren som anges i sökvillkoret contains. Egenskapen TableFulltextKeyColumn , som hämtas från OBJECTPROPERTYEX funktionen, innehå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.

Om du vill hämta de rader som du vill ha från den ursprungliga tabellen anger du en koppling till raderna CONTAINSTABLE . Den typiska formen av FROM -satsen för en SELECT -instruktion som använder 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 urvalskriterierna. Det här rankningsvärdet används vanligtvis på något av följande sätt i -instruktionen SELECT :

  • ORDER BY I -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 rätt SELECT behörighet i tabellen eller den refererade tabellens kolumner.

Exempel

A. Grundläggande exempel

I följande exempel skapas och fylls en enkel tabell med två kolumner med tre länder/regioner och färgerna i flaggorna. Den skapar och fyller i en fulltextkatalog och ett 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
(
    CountryOrRegion NVARCHAR (30) NOT NULL,
    FlagColors VARCHAR (200)
);

CREATE UNIQUE CLUSTERED INDEX FlagKey ON Flags(CountryOrRegion);

INSERT INTO Flags VALUES ('France', 'Blue and White and Red');
INSERT INTO Flags VALUES ('Italy', 'Green and White and Red');
INSERT INTO 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. Returnera 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. Returnera rankningsvärden som är större än ett angivet värde

gäller för: SQL Server 2012 (11.x) och senare versioner.

I följande exempel används NEAR för att söka bracket efter och reflector nära varandra i Production.Document tabellen. 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, uppfyller NEAR ett dokument som endast innehåller träffar vars mellanrum är större än 100 logiska termer inte kraven och dess rangordning är 0.

D. Returnera de fem främsta rankade resultaten med hjälp av top_n_by_rank

I följande exempel returneras beskrivningen av de fem främsta produkterna där Description kolumnen innehåller ordet aluminum nära antingen ordet light 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

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.