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 SELECT-instructie en wordt 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 BEVAT predicaat en gebruikt dezelfde zoekvoorwaarden als CONTAINS.

In tegenstelling tot CONTAINS retourneren query's met CONTAINSTABLE echter een relevantierangschikkingswaarde (RANK) en sleutel voor volledige tekst (KEY) 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
Is 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. Bij het uitvoeren van query's op een weergave kan slechts één geïndexeerde basistabel in volledige tekst worden betrokken.

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

column_name
Is 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
Is de taal waarvan de resources worden gebruikt voor woordbreking, stemming en synoniemenlijst en ruiswoorden (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 deze vertegenwoordigt 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 op een dergelijke kolom uitvoert, kunt u LANGUAGE**language_term de kans op een goede overeenkomst verhogen.

Wanneer deze is opgegeven als een tekenreeks, komt language_term overeen met de alias kolomwaarde in de sys.syslanguages compatibiliteitsweergave. 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 Microsoft SQL Server geconverteerd naar Unicode.

Als de opgegeven taal ongeldig 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 (Transact-SQL)voor meer informatie over zoekvoorwaarden.

Opmerkingen

Predicaten en functies in volledige tekst werken in één tabel, die wordt geïmpliceerd in het predicaat FROM. 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 bevat een kolom met de naam KEY die sleutelwaarden voor volledige tekst bevat. Elke geïndexeerde tabel met volledige tekst heeft een kolom waarvan de waarden gegarandeerd uniek zijn en de waarden die worden geretourneerd in de kolom SLEUTEL zijn de volledige-tekstsleutelwaarden van de rijen die voldoen aan de selectiecriteria die zijn opgegeven in de zoekvoorwaarde. De eigenschap TableFulltextKeyColumn, verkregen uit de functie OBJECTPROPERTYEX, biedt de identiteit van deze unieke sleutelkolom. Gebruik sys.fulltext_indexesom de id op te halen van de kolom die is gekoppeld aan de volledige-tekstsleutel van de index voor volledige tekst. Zie sys.fulltext_indexes (Transact-SQL)voor meer informatie.

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 met 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 door CONTAINSTABLE wordt geproduceerd, bevat een kolom met de naam RANK. De kolom RANK 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 deze manieren gebruikt in de SELECT-instructie:

  • In de COMPONENT ORDER BY worden de hoogste rijen als de eerste rijen in de tabel geretourneerd.

  • 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. Eenvoudig voorbeeld

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

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

In het volgende voorbeeld wordt gezocht naar alle productnamen met de woorden 'frame', 'wiel' of 'banden', en voor elk woord worden verschillende gewichten 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 hoger.

In het volgende voorbeeld wordt NEAR gebruikt om te zoeken naar 'bracket' en 'reflector' dicht bij elkaar in de Production.Document tabel. 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 volledige-tekstquery geen geheel getal opgeeft als de maximale afstand, is een document dat alleen treffers bevat waarvan de kloof groter is dan 100 logische termen niet aan de NEAR-vereisten voldoet en de rangschikking 0 is.

D. Top 5 gerangschikte resultaten retourneren met behulp van top_n_by_rank

In het volgende voorbeeld wordt de beschrijving van de top 5 producten geretourneerd waarbij de kolom Description het woord "aluminium" bevat in de buurt van het woord "licht" of het woord "lichtgewicht".

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

Zie ook

zoekresultaten beperken met RANG
query uitvoeren met Full-Text
Full-Text Search Query's (Visual Database Tools) maken
BEVAT (Transact-SQL)
query uitvoeren met Full-Text
SELECT (Transact-SQL)
FROM (Transact-SQL)