Megosztás a következőn keresztül:


CONTAINSTABLE (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példány

Egy nulla, egy vagy több sorból álló táblázatot ad vissza azon oszlopokhoz, amelyek pontos vagy homályos (kevésbé pontos) egyezést tartalmaznak egyetlen szóra és kifejezésre, a szavak egymástól meghatározott távolságon belüli közelségére vagy súlyozott egyezésekre. CONTAINSTABLEegy Transact-SQL utasítás SELECT használatos, és úgy hivatkozik rá, mintha normál táblanév lenne. Teljes szöveges SQL Server-keresést végez a karakteralapú adattípusokat tartalmazó, teljes szöveges indexelt oszlopokon.

CONTAINSTABLE ugyanolyan típusú találatok esetén hasznos, mint a CONTAINS , és ugyanazokat a keresési feltételeket használja, mint CONTAINSa .

A lekérdezésekkel ellentétben CONTAINSazonban minden sorhoz egy relevancia-rangsorértéket (CONTAINSTABLE) és egy teljes szöveges kulcsot (RANK) ad KEY vissza. Az SQL Server által támogatott teljes szöveges keresések formájával kapcsolatos információkért lásd: Lekérdezés Full-Text Keresési.

Transact-SQL szintaxis konvenciói

Szintaxis

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

Érvek

tábla

Egy teljes szöveges indexelt tábla neve. tábla lehet egy-, két-, három- vagy négyrészes adatbázis-objektum neve. Nézet lekérdezésekor csak egy teljes szöveges indexelt alaptáblát lehet bevonni.

a tábla nem tud kiszolgálónevet megadni, és nem használható a csatolt kiszolgálók lekérdezéseiben.

column_name

A teljes szöveges kereséshez indexelt egy vagy több oszlop neve. Az oszlopok lehetnek karakter, varchar, nchar, nvarchar, szöveg,,ntext, kép, xml, varbinaryvagy varbinary(max).

column_list

Azt jelzi, hogy több, vesszővel elválasztott oszlop is megadható. column_list zárójelek közé kell tenni. Ha nincs megadva language_term, a column_list összes oszlopának nyelvének azonosnak kell lennie.

*

Megadja, hogy tábla összes teljes szöveges indexelt oszlopát kell használni az adott keresési feltétel kereséséhez. Ha nincs megadva language_term, a tábla összes oszlopának nyelvének azonosnak kell lennie.

NYELVI language_term

Az a nyelv, amelynek erőforrásait szótöréshez, szótöréshez, szinonimaszótárhoz és zajszavak (vagy stopword) eltávolításához használják a lekérdezés részeként. Ez a paraméter nem kötelező, és megadható egy nyelv területi azonosítójának (LCID) megfelelő sztringként, egész számként vagy hexadecimális értékként. Ha language_term van megadva, a rendszer az általa képviselt nyelvet alkalmazza a keresési feltétel minden elemére. Ha nincs megadva érték, a rendszer a teljes szövegű oszlop nyelvét használja.

Ha a különböző nyelvek dokumentumai bináris nagyméretű objektumokként (BLOB-k) vannak tárolva egyetlen oszlopban, az adott dokumentum területi azonosítója (LCID) határozza meg, hogy a rendszer milyen nyelvet használ a tartalom indexeléséhez. Ha ilyen oszlopot kérdez le, adja meg LANGUAGE <language_term> a jó egyezés valószínűségének növelését.

Ha sztringként van megadva, language_term a aliassys.syslanguages kompatibilitási nézet oszlopértékének felel meg. A sztringet idézőjelek közé kell foglalni, ahogyan a "language_term" kifejezésben is szerepel. Ha egész számként van megadva, language_term a nyelvet azonosító tényleges LCID. Ha hexadecimális értékként van megadva, a language_term 0x, majd az LCID hexadecimális értéke követi. A hexadecimális érték nem haladhatja meg a nyolc számjegyet, beleértve a kezdő nullákat is.

Ha az érték kétbájtos karakterkészlet (DBCS) formátumban van, az SQL Server Unicode-ra konvertálja.

Ha a megadott nyelv érvénytelen, vagy nincs olyan erőforrás telepítve, amely megfelel az adott nyelvnek, az SQL Server hibát ad vissza. A semleges nyelvi erőforrások használatához adja meg a 0x0 language_term.

top_n_by_rank

Azt adja meg, hogy a rendszer csak az n legmagasabb rangsorolt egyezéseket adja vissza csökkenő sorrendben. Csak akkor érvényes, ha egy egész szám (n) van megadva. Ha top_n_by_rank más paraméterekkel van kombinálva, a lekérdezés kevesebb sort ad vissza, mint az összes predikátumnak ténylegesen megfelelő sorok száma. top_n_by_rank lehetővé teszi a lekérdezési teljesítmény növelését, ha csak a legrelevánsabb találatokat hívja vissza.

<contains_search_condition>

Megadja az column_name keresendő szöveget és az egyezés feltételeit. A keresési feltételekről további információt a CONTAINS című témakörben talál.

Megjegyzések

A teljes szöveges predikátumok és függvények egyetlen táblán működnek, amely a FROM predikátumban is szerepel. Ha több táblában szeretne keresni, a záradékban egy összekapcsolt táblával FROM kereshet két vagy több tábla termékét tartalmazó eredményhalmazban.

A visszaadott táblázat egy teljes szöveges kulcsértékeket tartalmazó oszlopot KEY tartalmaz. Minden teljes szöveges indexelt táblázat tartalmaz egy oszlopot, amelynek értékei garantáltan egyediek, az oszlopban KEY visszaadott értékek pedig a keresési feltételben megadott kiválasztási feltételeknek megfelelő sorok teljes szöveges kulcsértékei. A TableFulltextKeyColumn függvényből OBJECTPROPERTYEX beszerzett tulajdonság biztosítja ennek az egyedi kulcsoszlopnak az identitását. A teljes szöveges index teljes szöveges kulcsához társított oszlop azonosítójának lekéréséhez használja sys.fulltext_indexes a sys.fulltext_indexes című témakört.

A kívánt sorok eredeti táblából való lekéréséhez adjon meg egy illesztőt a CONTAINSTABLE sorokkal. Az utasításhoz használt FROMSELECT záradék tipikus formája CONTAINSTABLE a következő:

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

Az általa CONTAINSTABLE létrehozott tábla tartalmaz egy oszlopot.RANK Az RANK oszlop minden sorhoz egy érték (0 és 1000 között), amely azt jelzi, hogy egy sor mennyire felelt meg a kiválasztási feltételeknek. Ezt a rangértéket általában a következő módok egyikében használják az SELECT utasításban:

  • A záradékban a ORDER BY legmagasabb rangsorolású sorokat adja vissza a táblázat első soraként.

  • A kiválasztási listában megtekintheti az egyes sorokhoz rendelt rangsorértéket.

Engedélyek

A végrehajtási engedélyek csak a SELECT megfelelő jogosultságokkal rendelkező felhasználók számára érhetők el a táblában vagy a hivatkozott tábla oszlopaiban.

Példák

Egy. Egyszerű példa

Az alábbi példa egy egyszerű, két oszlopból álló táblázatot hoz létre és tölt fel, amely három országot/régiót és a hozzájuk tartozó színeket sorolja fel. Létrehoz és feltölt egy teljes szöveges katalógust és indexet a táblán. Ezután a CONTAINSTABLE szintaxis be lesz mutatva. Ez a példa bemutatja, hogyan nő a rangsor értéke, ha a keresési érték többször is teljesül. Az utolsó lekérdezésben a zöldet és a feketét egyaránt tartalmazó Tanzánia magasabb rangot kapott, mint Olaszország, amely csak az egyik lekérdezett színt tartalmazza.

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. Rangsorértékek visszaadva

Az alábbi példa az összes olyan terméknevet keresi, amely tartalmazza a szavakat frame, wheelvagy tire, és különböző súlyokat ad az egyes szavaknak. A keresési feltételeknek megfelelő összes visszaadott sor esetében megjelenik az egyezés relatív közelsége (rangsorolási értéke). Emellett a legmagasabb rangsorolási sorok lesznek az elsők.

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. Egy megadott értéknél nagyobb rangértékeket ad vissza

A: SQL Server 2012 (11.x) és újabb verziókra vonatkozik.

Az alábbi példa a NEAR használatával keres bracket és reflector közel áll egymáshoz a Production.Document táblázatban. Csak az 50 vagy annál magasabb rangsorértékkel rendelkező sorok lesznek visszaadva.

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

Jegyzet

Ha egy teljes szöveges lekérdezés nem határoz meg egész számot a maximális távolságként, a csak olyan találatokat tartalmazó dokumentumok, amelyek 100-nál nagyobb logikai kifejezésnél nagyobb rést tartalmaznak, nem felelnek meg a NEAR követelményeknek, és rangsorolása 0.

D. Az első öt rangsorolt találatot adja vissza a top_n_by_rank

Az alábbi példa az első öt termék leírását adja vissza, ahol az Description oszlop a szó vagy a szó aluminumlightközelében lévő szót lightweight tartalmazza.

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. A LANGUAGE argumentum megadása

Az alábbi példa a LANGUAGE argumentum használatát mutatja be.

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

Jegyzet

A LANGUAGE language_term argumentum nem szükséges a top_n_by_rank használatához.