FREETEXT (Transact-SQL)
Dotyczy:sql ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL Database w usłudze Microsoft Fabric
Jest predykatem używanym w klauzuli Transact-SQL WHERE instrukcji Transact-SQL SELECT do wykonywania pełnotekstowego wyszukiwania w pełnotekstowych kolumnach indeksowanych pełnotekstowych zawierających typy danych opartych na znakach. Ten predykat wyszukuje wartości, które pasują do znaczenia, a nie tylko dokładne sformułowanie wyrazów w warunku wyszukiwania. Gdy jest używany tekst FREETEXT, aparat zapytań pełnotekstowych wewnętrznie wykonuje następujące akcje na freetext_string, przypisuje każdy termin wagi, a następnie znajduje dopasowania:
Oddziela ciąg na poszczególne wyrazy na podstawie granic wyrazów (dzielenie wyrazów).
Generuje formę przegięcia wyrazów (wynikającą).
Określa listę rozszerzeń lub zamian terminów na podstawie dopasowań w tezaurusie.
Uwaga
Aby uzyskać informacje na temat formularzy wyszukiwań pełnotekstowych obsługiwanych przez program SQL Server, zobacz Query with Full-Text Search.
Dotyczy: SQL Server ( SQL Server 2008 (10.0.x) do bieżącej wersji).
Transact-SQL konwencje składni
FREETEXT ( { column_name | (column_list) | * }
, 'freetext_string' [ , LANGUAGE language_term ] )
column_name
Jest nazwą co najmniej jednej kolumny indeksowanej pełnotekstowo tabeli określonej w klauzuli FROM. 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 zarejestrowane do wyszukiwania pełnotekstowego powinny być używane do wyszukiwania dla danego freetext_string. Jeśli więcej niż jedna tabela znajduje się w klauzuli FROM, * musi być kwalifikowana przez nazwę tabeli. Jeśli nie określono language_term, język wszystkich kolumn tabeli musi być taki sam.
freetext_string
To tekst do wyszukania w column_name. Można wprowadzić dowolny tekst, w tym wyrazy, frazy lub zdania. Dopasowania są generowane, jeśli dowolny termin lub formularze dowolnego terminu zostaną znalezione w indeksie pełnotekstowym.
W przeciwieństwie do warunku wyszukiwania CONTAINS i CONTAINSTABLE, gdzie AND jest słowem kluczowym, w przypadku użycia w freetext_string wyraz "and" jest uważany za wyraz szumu lub stopwordi zostanie odrzucony.
Korzystanie z funkcji WEIGHT, FORMSOF, symboli wieloznacznych, FUNKCJI NEAR i innej składni nie jest dozwolone. freetext_string jest złamany wyrazem, stemmed i przekazywany przez tezaurusa.
freetext_stringnvarchar. Niejawna konwersja występuje, gdy inny typ danych znaków jest używany jako dane wejściowe. Nie można używać dużych typów danych ciągów nvarchar(max) i varchar(max). W poniższym przykładzie zmienna @SearchWord
zdefiniowana jako varchar(30)
powoduje niejawną konwersję w predykacie FREETEXT
.
USE AdventureWorks2022;
GO
DECLARE @SearchWord VARCHAR(30)
SET @SearchWord ='performance'
SELECT Description
FROM Production.ProductDescription
WHERE FREETEXT(Description, @SearchWord);
Ponieważ "wąchanie parametrów" nie działa w ramach konwersji, użyj nvarchar w celu uzyskania lepszej wydajności. W tym przykładzie zadeklaruj @SearchWord
jako nvarchar(30)
.
USE AdventureWorks2022;
GO
DECLARE @SearchWord NVARCHAR(30)
SET @SearchWord = N'performance'
SELECT Description
FROM Production.ProductDescription
WHERE FREETEXT(Description, @SearchWord);
Możesz również użyć wskazówki optymalizowania pod kątem zapytań w przypadkach, w których generowany jest nieoptymalny plan.
LANGUAGE_TERM JĘZYKA
To język, którego zasoby będą używane na potrzeby przerywania wyrazów, ściągnięcia, a także usuwania tezaurusa i stopwordu w ramach 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_term LANGUAGE 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 Microsoft SQL Server zwraca błąd. Aby użyć zasobów języka neutralnego, określ 0x0 jako language_term.
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.
Zapytania pełnotekstowe używające tekstu FREETEXT są mniej precyzyjne niż zapytania pełnotekstowe korzystające z funkcji CONTAINS. Aparat wyszukiwania pełnotekstowego programu SQL Server identyfikuje ważne wyrazy i frazy. Żadne specjalne znaczenie nie ma żadnego z zarezerwowanych słów kluczowych lub symboli wieloznacznych, które zwykle mają znaczenie, gdy określono w parametrze <contains_search_condition> predykatu CONTAINS.
Predykaty pełnotekstowe nie są dozwolone w klauzuli OUTPUT, gdy poziom zgodności bazy danych jest ustawiony na 100.
Uwaga
Funkcja FREETEXTTABLE jest przydatna dla tego samego rodzaju dopasowań co predykat FREETEXT. Możesz odwołać się do tej funkcji, takiej jak zwykła nazwa tabeli w klauzuli FROM instrukcji SELECT. Aby uzyskać więcej informacji, zobacz FREETEXTTABLE (Transact-SQL).
Możesz użyć nazwy czteroczęściowej w CONTAINS lub FREETEXT predykat, aby wykonać zapytanie o kolumny indeksowane pełnotekstowo tabel docelowych na serwerze połączonym. Aby przygotować serwer zdalny do odbierania zapytań pełnotekstowych, utwórz indeks pełnotekstowy w tabelach docelowych i kolumnach na serwerze zdalnym, a następnie dodaj serwer zdalny jako serwer połączony.
W przeciwieństwie do wyszukiwania pełnotekstowego likeTransact-SQL predykat działa tylko na wzorcach znaków. Ponadto nie można użyć predykatu LIKE do wykonywania zapytań o sformatowane dane binarne. Ponadto zapytanie LIKE względem dużej ilości danych tekstowych bez struktury jest znacznie wolniejsze niż równoważne zapytanie pełnotekstowe względem tych samych danych. Zapytanie LIKE względem milionów wierszy danych tekstowych może potrwać kilka minut. podczas gdy zapytanie pełnotekstowe może potrwać tylko kilka sekund lub mniej względem tych samych danych, w zależności od liczby zwracanych wierszy.
Poniższy przykład wyszukuje wszystkie dokumenty zawierające wyrazy związane z istotnymi, bezpieczeństwa, składnikami.
USE AdventureWorks2022;
GO
SELECT Title
FROM Production.Document
WHERE FREETEXT (Document, 'vital safety components' );
GO
W poniższym przykładzie użyto zmiennej zamiast określonego terminu wyszukiwania.
USE AdventureWorks2022;
GO
DECLARE @SearchWord NVARCHAR(30);
SET @SearchWord = N'high-performance';
SELECT Description
FROM Production.ProductDescription
WHERE FREETEXT(Description, @SearchWord);
GO
rozpoczynanie pracy z usługą Full-Text Search
tworzenie katalogów Full-Text i zarządzanie nimi
CREATE FULLTEXT CATALOG (Transact-SQL)
CREATE FULLTEXT INDEX (Transact-SQL)
tworzenie indeksów Full-Text i zarządzanie nimi
Query with Full-Text Search
tworzenie zapytań wyszukiwania Full-Text (Visual Database Tools)
CONTAINS (Transact-SQL)
CONTAINSTABLE (Transact-SQL)
typy danych (Transact-SQL)
FREETEXTTABLE (Transact-SQL)
WHERE (Transact-SQL)