CONTAINSTABLE (Transact-SQL)
Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance
Zwraca tabelę zero, jeden lub więcej wierszy dla tych kolumn zawierających dokładne lub rozmyte (mniej precyzyjne) dopasowania do pojedynczych wyrazów i fraz, bliskość wyrazów w określonej odległości od siebie lub dopasowania ważone. Funkcja CONTAINSTABLE jest używana w klauzuli FROM instrukcji Transact-SQL SELECT i jest przywoływała tak, jakby była to zwykła nazwa tabeli. Wykonuje wyszukiwanie pełnotekstowe programu SQL Server w kolumnach indeksowanych pełnotekstowo zawierających typy danych oparte na znakach.
Funkcja CONTAINSTABLE jest przydatna w przypadku takich samych typów dopasowań, jak ZAWIERA predykat i używa tych samych warunków wyszukiwania co CONTAINS.
W przeciwieństwie do funkcji CONTAINS, jednak zapytania używające funkcji CONTAINSTABLE zwracają wartość klasyfikacji istotności (RANK) i klucz pełnotekstowy (KEY) dla każdego wiersza. Aby uzyskać informacje na temat formularzy wyszukiwań pełnotekstowych obsługiwanych przez program SQL Server, zobacz Query with Full-Text Search.
Transact-SQL konwencje składni
Składnia
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 ]
)
Argumenty
tabeli
To nazwa tabeli, która została indeksowana pełnotekstowo.
tabeli może być jedną, dwuczęściową lub czteroczęściową nazwą obiektu bazy danych. Podczas wykonywania zapytań dotyczących widoku może być zaangażowany tylko jedna tabela bazowa indeksowana pełnotekstowo.
tabeli nie może określić nazwy serwera i nie można ich używać w zapytaniach względem serwerów połączonych.
column_name
To nazwa co najmniej jednej kolumny indeksowanej na potrzeby wyszukiwania pełnotekstowego. Kolumny mogą być typu
column_list
Wskazuje, że można określić kilka kolumn rozdzielonych przecinkami.
column_list muszą być ujęte w nawiasy. Jeśli nie określono language_term, język wszystkich kolumn column_list musi być taki sam.
*
Określa, że wszystkie kolumny indeksowane pełnotekstowo w tabeli powinny być używane do wyszukiwania danego warunku wyszukiwania. Jeśli nie określono language_term, język wszystkich kolumn tabeli musi być taki sam.
LANGUAGE_TERM JĘZYKA
To język, którego zasoby będą używane do usuwania wyrazów, przerywania wyrazów oraz tezaurusa i wyrazu szumu (lub stopword) jako części zapytania. Ten parametr jest opcjonalny i może być określony jako ciąg, liczba całkowita lub wartość szesnastkowa odpowiadająca identyfikatorowi ustawień regionalnych (LCID) języka. Jeśli language_term zostanie określony, język, który reprezentuje, zostanie zastosowany do wszystkich elementów warunku wyszukiwania. Jeśli nie określono żadnej wartości, używany jest język pełnotekstowy kolumny.
Jeśli dokumenty różnych języków są przechowywane razem jako binarne duże obiekty (BLOB) w jednej kolumnie, identyfikator ustawień regionalnych (LCID) danego dokumentu określa język używany do indeksowania zawartości. Podczas wykonywania zapytań dotyczących takiej kolumny określenie LANGUAGE**language_term może zwiększyć prawdopodobieństwo dobrego dopasowania.
Po określeniu jako ciągu language_term odpowiada wartości kolumny aliasu w widoku zgodności sys.syslanguages. Ciąg musi być ujęta w pojedynczy cudzysłów, tak jak w ciągu "language_term". Po określeniu jako liczba całkowita language_term jest rzeczywistym identyfikatorem LCID identyfikującym język. Po określeniu jako wartości szesnastkowej language_term jest 0x, a następnie wartość szesnastkowa LCID. Wartość szesnastkowa nie może przekraczać ośmiu cyfr, w tym zer wiodących.
Jeśli wartość jest w formacie zestawu znaków dwubajtowych (DBCS), program Microsoft SQL Server przekonwertuje ją na Unicode.
Jeśli określony język jest nieprawidłowy lub nie ma zainstalowanych zasobów odpowiadających temu językowi, program SQL Server zwraca błąd. Aby użyć zasobów języka neutralnego, określ 0x0 jako language_term.
top_n_by_rank
Określa, że zwracane są tylko n najwyżej sklasyfikowanych dopasowań w kolejności malejącej. Ma zastosowanie tylko wtedy, gdy określono wartość całkowitą n. Jeśli top_n_by_rank jest połączona z innymi parametrami, zapytanie może zwrócić mniej wierszy niż liczba wierszy, które faktycznie pasują do wszystkich predykatów.
top_n_by_rank pozwala zwiększyć wydajność zapytań, przypominając tylko najbardziej istotne trafienia.
<contains_search_condition>
Określa tekst do wyszukania w column_name i warunki dopasowania. Aby uzyskać informacje o warunkach wyszukiwania, zobacz CONTAINS (Transact-SQL).
Uwagi
Predykaty i funkcje pełnotekstowe działają na pojedynczej tabeli, co jest implikowane w predykacie FROM. Aby wyszukać wiele tabel, użyj tabeli sprzężonej w klauzuli FROM, aby wyszukać zestaw wyników, który jest produktem co najmniej dwóch tabel.
Zwrócona tabela zawiera kolumnę o nazwie KEY zawierającą wartości klucza pełnotekstowego. Każda indeksowana tabela pełnotekstowa ma kolumnę, której wartości mają być unikatowe, a wartości zwracane w kolumnie KEY są wartościami klucza pełnotekstowego wierszy, które są zgodne z kryteriami wyboru określonymi w warunku wyszukiwania. Właściwość TableFulltextKeyColumn uzyskana z funkcji OBJECTPROPERTYEX zapewnia tożsamość tej unikatowej kolumny klucza. Aby uzyskać identyfikator kolumny skojarzonej z kluczem pełnotekstowym indeksu pełnotekstowego, użyj sys.fulltext_indexes. Aby uzyskać więcej informacji, zobacz sys.fulltext_indexes (Transact-SQL).
Aby uzyskać wiersze z oryginalnej tabeli, określ sprzężenie z wierszami CONTAINSTABLE. Typową formą klauzuli FROM dla instrukcji SELECT przy użyciu funkcji CONTAINSTABLE jest:
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];
Tabela utworzona przez element CONTAINSTABLE zawiera kolumnę o nazwie RANK. Kolumna RANK jest wartością (od 0 do 1000) dla każdego wiersza wskazującą, jak dobrze wiersz pasuje do kryteriów wyboru. Ta wartość klasyfikacji jest zwykle używana na jeden z następujących sposobów w instrukcji SELECT:
W klauzuli ORDER BY, aby zwrócić wiersze o najwyższej klasyfikacji jako pierwsze wiersze w tabeli.
Na liście wybierz, aby wyświetlić wartość rangi przypisanej do każdego wiersza.
Uprawnienia
Uprawnienia wykonywania są dostępne tylko dla użytkowników z odpowiednimi uprawnieniami SELECT w tabeli lub kolumnach tabeli, do których się odwołujesz.
Przykłady
A. Prosty przykład
Poniższy przykład tworzy i wypełnia prostą tabelę dwóch kolumn, wyświetlając listę 3 powiatów i kolory w flagach. Spowoduje to utworzenie i wypełnienie wykazu pełnotekstowego i indeksu w tabeli. Następnie przedstawiono składnię CONTAINSTABLE. W tym przykładzie pokazano, jak wartość rangi rośnie wyższa, gdy wartość wyszukiwania jest wielokrotnie osiągana. W ostatnim zapytaniu Tanzania, która zawiera zarówno zieloną, jak i czarną, ma wyższą rangę niż Włochy, które zawierają tylko jeden z zapytanych kolorów.
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. Zwracanie wartości rangi
W poniższym przykładzie wyszukiwane są wszystkie nazwy produktów zawierające wyrazy "frame", "wheel" lub "tire" (opona) oraz różne wagi poszczególnych wyrazów. Dla każdego zwracanego wiersza zgodnego z tymi kryteriami wyszukiwania wyświetlana jest względna bliskość (wartość klasyfikacji) dopasowania. Ponadto zwracane są najpierw najwyższe wiersze klasyfikacji.
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. Zwracanie wartości rangi większej niż określona wartość
Dotyczy: SQL Server 2012 (11.x) i nowsze. |
W poniższym przykładzie użyto funkcji NEAR, aby wyszukać "bracket
" i "reflector
" blisko siebie w tabeli Production.Document
. Zwracane są tylko wiersze o wartości rangi 50 lub wyższej.
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
Nuta
Jeśli zapytanie pełnotekstowe nie określa liczby całkowitej jako maksymalnej odległości, dokument zawierający tylko trafienia, którego różnica jest większa niż 100 terminów logicznych, nie spełnia wymagań NEAR, a jego klasyfikacja będzie równa 0.
D. Zwracanie pierwszych 5 sklasyfikowanych wyników przy użyciu top_n_by_rank
Poniższy przykład zwraca opis 5 najlepszych produktów, w których kolumna Description
zawiera słowo "aluminium" w pobliżu słowa "light" lub słowa "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. Określanie argumentu LANGUAGE
W poniższym przykładzie pokazano użycie argumentu 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
Nuta
Argument LANGUAGE language_term nie jest wymagany do używania top_n_by_rank.
Zobacz też
ogranicz wyniki wyszukiwania przy użyciu RANK
Query with Full-Text Search
tworzenie zapytań wyszukiwania Full-Text (Visual Database Tools)
CONTAINS (Transact-SQL)
Query with Full-Text Search
SELECT (Transact-SQL)
FROM (Transact-SQL)