Delen via


CONTAINSTABLE (Transact-SQL)

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Retourneert een tabel met nul, een of meer rijen voor die kolommen met nauwkeurige of fuzzy (minder nauwkeurige) overeenkomsten met enkele woorden en woordgroepen, de nabijheid van woorden binnen een bepaalde afstand van elkaar of gewogen overeenkomsten. CONTAINSTABLE wordt gebruikt in de FROM-component van een Transact-SQL-instructie SELECT en wordt ernaar verwezen alsof het een gewone tabelnaam is. Het voert een zoekopdracht in volledige tekst uit op volledige tekst geïndexeerde kolommen met gegevenstypen op basis van tekens.

CONTAINSTABLE is handig voor dezelfde soorten overeenkomsten als de CONTAINS en gebruikt dezelfde zoekvoorwaarden als CONTAINS.

In tegenstelling tot CONTAINSquery's die CONTAINSTABLE een relevantierangschikkingswaarde (RANK) en een volledige-tekstsleutel (KEY) gebruiken voor elke rij. Zie Query met Full-Text Searchvoor informatie over de vormen van zoekopdrachten in volledige tekst die worden ondersteund door SQL Server.

Transact-SQL syntaxisconventies

Syntaxis

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 ]
    )

Argumenten

tabel

De naam van een tabel die is geïndexeerd in volledige tekst. tabel kan een naam zijn voor een databaseobject met één, twee, drie of vier delen. Wanneer u een query uitvoert op een weergave, kan slechts één geïndexeerde basistabel met volledige tekst worden betrokken.

tabel kan geen servernaam opgeven en kan niet worden gebruikt in query's op gekoppelde servers.

column_name

De naam van een of meer kolommen die zijn geïndexeerd voor zoeken in volledige tekst. De kolommen kunnen van het type teken, varchar, nchar, nvarchar, tekst, , ntext, afbeelding, xml-, varbinaireof varbinary(max).

column_list

Geeft aan dat meerdere kolommen, gescheiden door een komma, kunnen worden opgegeven. column_list moet tussen haakjes staan. Tenzij language_term is opgegeven, moet de taal van alle kolommen van column_list hetzelfde zijn.

*

Hiermee geeft u op dat alle geïndexeerde kolommen in volledige tekst in tabel moeten worden gebruikt om te zoeken naar de opgegeven zoekvoorwaarde. Tenzij language_term is opgegeven, moet de taal van alle kolommen van de tabel hetzelfde zijn.

LANGUAGE language_term

De taal waarvan de resources worden gebruikt voor woordbreking, stemming en synoniemenlijst en ruiswoord (of stopword) verwijderen als onderdeel van de query. Deze parameter is optioneel en kan worden opgegeven als een tekenreeks, geheel getal of hexadecimale waarde die overeenkomt met de landinstellings-id (LCID) van een taal. Als language_term is opgegeven, wordt de taal die wordt opgegeven, toegepast op alle elementen van de zoekvoorwaarde. Als er geen waarde is opgegeven, wordt de volledige teksttaal van de kolom gebruikt.

Als documenten van verschillende talen samen worden opgeslagen als binaire grote objecten (BLOBs) in één kolom, bepaalt de landinstellings-id (LCID) van een bepaald document welke taal wordt gebruikt om de inhoud te indexeren. Wanneer u een query uitvoert op een dergelijke kolom, geeft u LANGUAGE <language_term> op om de kans op een goede overeenkomst te vergroten.

Wanneer deze is opgegeven als een tekenreeks, komt language_term overeen met de alias kolomwaarde in de compatibiliteitsweergave sys.syslanguages . De tekenreeks moet tussen enkele aanhalingstekens staan, zoals in 'language_term'. Wanneer dit is opgegeven als een geheel getal, is language_term de werkelijke LCID die de taal identificeert. Wanneer deze waarde is opgegeven als een hexadecimale waarde, wordt language_term 0x gevolgd door de hexadecimale waarde van de LCID. De hexadecimale waarde mag niet groter zijn dan acht cijfers, inclusief voorloopnullen.

Als de waarde de DBCS-indeling (Double-Byte Character Set) heeft, wordt deze door SQL Server geconverteerd naar Unicode.

Als de opgegeven taal niet geldig is of er geen resources zijn geïnstalleerd die overeenkomen met die taal, retourneert SQL Server een fout. Als u de neutrale taalbronnen wilt gebruiken, geeft u 0x0 op als language_term.

top_n_by_rank

Hiermee geeft u op dat alleen de n hoogste gerangschikte overeenkomsten, in aflopende volgorde, worden geretourneerd. Is alleen van toepassing wanneer een geheel getal, n, is opgegeven. Als top_n_by_rank wordt gecombineerd met andere parameters, kan de query minder rijen retourneren dan het aantal rijen dat daadwerkelijk overeenkomt met alle predicaten. top_n_by_rank kunt u de queryprestaties verbeteren door alleen de meest relevante treffers in te halen.

<contains_search_condition>

Hiermee geeft u de tekst op die moet worden gezocht in column_name en de voorwaarden voor een overeenkomst. Zie CONTAINS voor informatie over zoekvoorwaarden.

Opmerkingen

Predicaten en functies in volledige tekst werken in één tabel, die wordt geïmpliceerd in het FROM predicaat. Als u in meerdere tabellen wilt zoeken, gebruikt u een gekoppelde tabel in uw FROM component om te zoeken naar een resultatenset die het product is van twee of meer tabellen.

De geretourneerde tabel heeft een kolom met de naam KEY volledige-tekstsleutelwaarden. Elke geïndexeerde tabel met volledige tekst heeft een kolom waarvan de waarden gegarandeerd uniek zijn en de waarden die in de KEY kolom worden geretourneerd, de sleutelwaarden voor volledige tekst zijn van de rijen die voldoen aan de selectiecriteria die zijn opgegeven in de zoekvoorwaarde. De TableFulltextKeyColumn eigenschap, verkregen uit de OBJECTPROPERTYEX functie, biedt de identiteit van deze unieke sleutelkolom. Zie sys.fulltext_indexes voor meer informatie om de id op te halen van de kolom die is gekoppeld aan de volledige-tekstsleutel van de index sys.fulltext_indexes voor volledige tekst.

Als u de gewenste rijen wilt ophalen uit de oorspronkelijke tabel, geeft u een join op met de CONTAINSTABLE rijen. De typische vorm van de FROM component voor een SELECT instructie die wordt gebruikt CONTAINSTABLE , is:

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];

De tabel die wordt geproduceerd door CONTAINSTABLE bevat een kolom met de naam RANK. De RANK kolom is een waarde (van 0 tot en met 1000) voor elke rij die aangeeft hoe goed een rij overeenkomt met de selectiecriteria. Deze rangschikkingswaarde wordt doorgaans op een van de volgende manieren in de SELECT instructie gebruikt:

  • In de ORDER BY component voor het retourneren van de hoogste rijen als de eerste rijen in de tabel.

  • In de lijst selecteren ziet u de rangschikkingswaarde die aan elke rij is toegewezen.

Machtigingen

Uitvoermachtigingen zijn alleen beschikbaar voor gebruikers met de juiste SELECT bevoegdheden voor de tabel of de kolommen van de tabel waarnaar wordt verwezen.

Voorbeelden

Een. Basisvoorbeeld

In het volgende voorbeeld wordt een eenvoudige tabel met twee kolommen gemaakt en gevuld, met drie landen/regio's en de kleuren in hun vlaggen. Er wordt een volledige tekstcatalogus en -index in de tabel gemaakt en gevuld. Vervolgens wordt de CONTAINSTABLE syntaxis gedemonstreerd. In dit voorbeeld ziet u hoe de rangschikkingswaarde hoger wordt wanneer de zoekwaarde meerdere keren wordt bereikt. In de laatste query heeft Tanzania, dat zowel groen als zwart bevat, een hogere rang dan Italië die slechts een van de opgevraagde kleuren bevat.

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. Rangschikkingswaarden retourneren

In het volgende voorbeeld wordt gezocht naar alle productnamen met de woorden frame, wheelof tire, en er worden verschillende gewichten aan elk woord gegeven. Voor elke geretourneerde rij die overeenkomt met deze zoekcriteria, wordt de relatieve nabijheid (classificatiewaarde) van de overeenkomst weergegeven. Daarnaast worden eerst de hoogste rangschikkingsrijen geretourneerd.

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. Rangschikkingswaarden retourneren die groter zijn dan een opgegeven waarde

Van toepassing op: SQL Server 2012 (11.x) en latere versies.

In het volgende voorbeeld wordt NEAR gebruikt om te zoeken naar en reflector dicht bij elkaar in de Production.Document tabel te staanbracket. Alleen rijen met een rangwaarde van 50 of hoger worden geretourneerd.

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

Notitie

Als een query in volledige tekst geen geheel getal opgeeft als maximale afstand, voldoet een document dat alleen treffers bevat waarvan de kloof groter is dan 100 logische termen niet aan de vereisten voldoet en de NEAR rangschikking 0 is.

D. Top vijf gerangschikte resultaten retourneren met behulp van top_n_by_rank

In het volgende voorbeeld wordt de beschrijving geretourneerd van de vijf belangrijkste producten waarin de kolom het woord in de Description buurt van het woord aluminum of het woord lightlightweightbevat.

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. Het argument TAAL opgeven

In het volgende voorbeeld ziet u hoe u het argument LANGUAGE gebruikt.

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

Notitie

Het argument LANGUAGE language_term is niet vereist voor het gebruik van top_n_by_rank.