Udostępnij za pośrednictwem


Wykonywanie zapytań za pomocą wyszukiwania Full-Text

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Napisz zapytania pełnotekstowe używając predykatów CONTAINS i FREETEXT oraz funkcji wartości zestawu wierszy CONTAINSTABLE i FREETEXTTABLE z instrukcją SELECT. Ten artykuł zawiera przykłady poszczególnych predykatów i funkcji oraz ułatwia wybór najlepszego do użycia.

  • Aby dopasować wyrazy i frazy, użyj CONTAINS i CONTAINSTABLE.
  • Aby dopasować znaczenie, lecz nie dokładne brzmienie tekstu, użyj FREETEXT i FREETEXTTABLE.

Przykłady poszczególnych predykatów i funkcji

W poniższych przykładach użyto przykładowej bazy danych AdventureWorks. Aby uzyskać ostateczną wersję AdventureWorks, zobacz AdventureWorks Databases and Scripts for SQL Server 2016 CTP3. Aby uruchomić przykładowe zapytania, należy również skonfigurować Full-Text Search. Aby uzyskać więcej informacji, zobacz Rozpoczynanie pracy z usługą Full-Text Search.

Przykład — ZAWIERA

Poniższy przykład znajduje wszystkie produkty z ceną $80.99, które zawierają słowo "Mountain":

USE AdventureWorks2022  
GO  
  
SELECT Name, ListPrice  
FROM Production.Product  
WHERE ListPrice = 80.99  
   AND CONTAINS(Name, 'Mountain')  
GO  

Przykład — FREETEXT

Poniższy przykład wyszukuje wszystkie dokumenty zawierające wyrazy powiązane z vital safety components:

USE AdventureWorks2022  
GO  
  
SELECT Title  
FROM Production.Document  
WHERE FREETEXT (Document, 'vital safety components')  
GO  

Przykład — CONTAINSTABLE

Poniższy przykład zwraca identyfikator opisu i opis wszystkich produktów, dla których kolumna Description zawiera słowo "aluminium" w pobliżu słowa "light" lub słowa "lightweight". Zwracane są tylko wiersze o klasyfikacji 2 lub wyższej.

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)'  
   ) AS KEY_TBL  
   ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]  
WHERE KEY_TBL.RANK > 2  
ORDER BY KEY_TBL.RANK DESC;  
GO  

Przykład — FREETEXTTABLE

Poniższy przykład rozszerza zapytanie FREETEXTTABLE w celu zwrócenia wierszy o najwyższej klasyfikacji jako pierwszych i dodania klasyfikacji każdego wiersza do listy wyników. Aby napisać podobne zapytanie, musisz wiedzieć, że ProductDescriptionID jest unikatową kolumną klucza dla tabeli ProductDescription.

USE AdventureWorks2022  
GO  
  
SELECT KEY_TBL.RANK, FT_TBL.Description  
FROM Production.ProductDescription AS FT_TBL   
     INNER JOIN  
     FREETEXTTABLE(Production.ProductDescription, Description,  
                    'perfect all-around bike') AS KEY_TBL  
     ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]  
ORDER BY KEY_TBL.RANK DESC  
GO  

Oto rozszerzenie tego samego zapytania, które zwraca tylko wiersze o klasyfikacji 10 lub większej:

USE AdventureWorks2022  
GO  
  
SELECT KEY_TBL.RANK, FT_TBL.Description  
FROM Production.ProductDescription AS FT_TBL   
     INNER JOIN  
     FREETEXTTABLE(Production.ProductDescription, Description,  
                    'perfect all-around bike') AS KEY_TBL  
     ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]  
WHERE KEY_TBL.RANK >= 10  
ORDER BY KEY_TBL.RANK DESC  
GO  

Dopasuj wyrazy lub dopasuj znaczenie

CONTAINS / CONTAINSTABLE i FREETEXT/FREETEXTTABLE są przydatne w przypadku różnych rodzajów dopasowania. Poniższe informacje ułatwiają wybranie najlepszego predykatu lub funkcji dla zapytania:

CONTAINS/CONTAINSTABLE

  • Dopasowywanie pojedynczych wyrazów i fraz z precyzyjnym lub rozmytym (mniej precyzyjnym) dopasowaniem.
  • Możesz również wykonać następujące czynności:
    • Określ bliskość wyrazów w określonej odległości od siebie.
    • Zwracane dopasowania ważone.
    • Łączenie warunków wyszukiwania z operatorami logicznymi. Aby uzyskać więcej informacji, zobacz Używanie operatorów logicznych (AND, OR i NOT) w dalszej części tego artykułu.

FREETEXT/FREETEXTTABLE

  • Dopasuj znaczenie, ale nie dokładne sformułowanie określonych wyrazów, fraz lub zdań (ciąg tekstu swobodnego ).
  • Dopasowania są generowane, jeśli w indeksie pełnotekstowym określonej kolumny znajduje się dowolny termin lub dowolna forma terminu.

Porównanie predykatów i funkcji

Predykaty CONTAINS/FREETEXT i funkcje wartości zestawu wierszy CONTAINSTABLE/FREETEXTTABLE mają różne składnie i opcje. Poniższe informacje ułatwiają wybranie najlepszego predykatu lub funkcji dla zapytania:

Predykaty CONTAINS i FREETEXT

użycie. Użyj pełnotekstowych predykatów CONTAINS i FREETEXT w klauzuli WHERE lub HAVING instrukcji SELECT.

wyniki. Predykaty CONTAINS i FREETEXT zwracają wartość TRUE lub FALSE, która wskazuje, czy dany wiersz jest zgodny z zapytaniem pełnotekstowym. Pasujące wiersze są zwracane w zestawie wyników.

więcej opcji. Predykaty można połączyć z dowolnymi innymi predykatami Transact-SQL, takimi jak LIKE i BETWEEN.

Można określić jedną kolumnę, listę kolumn lub wszystkie kolumny w tabeli do przeszukania.

Opcjonalnie można określić język, którego zasoby są używane przez zapytanie pełnotekstowe do przetwarzania i odmiany wyrazów, wyszukiwania w tezaurusie oraz usuwania wyrazów zbędnych.

Możesz użyć czteroczęściowej nazwy w predykacie CONTAINS lub FREETEXT, 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.

więcej informacji. Aby uzyskać więcej informacji na temat składni i argumentów tych predykatów, zobacz CONTAINS and FREETEXT.

Funkcje wartości zestawu wierszy CONTAINSTABLE i FREETEXTTABLE

Użycie. Użyj funkcji pełnotekstowych, funkcji CONTAINSTABLE i FREETEXTTABLE, takich jak zwykła nazwa tabeli w klauzuli FROM instrukcji SELECT.

Należy określić tabelę podstawową do wyszukania podczas korzystania z jednej z tych funkcji. Podobnie jak w przypadku predykatów, można określić jedną kolumnę, listę kolumn lub wszystkie kolumny w tabeli do przeszukania i opcjonalnie język, którego zasoby są używane przez daną kwerendę pełnotekstową.

Zazwyczaj należy połączyć wyniki funkcji CONTAINSTABLE lub FREETEXTTABLE z tabelą podstawową. Aby połączyć tabele, musisz znać unikatową nazwę kolumny klucza. Ta kolumna, która występuje w każdej tabeli z włączonym pełnym tekstem, jest używana do wymuszania unikatowych wierszy dla tabeli (unikatowa kolumna**klucz). Aby uzyskać więcej informacji na temat kolumny klucza, zobacz Tworzenie indeksów Full-Text i zarządzanie nimi.

wyniki. Te funkcje zwracają tabelę zawierającą zero, jeden lub więcej wierszy zgodnych z zapytaniem pełnotekstowym. Zwracana tabela zawiera tylko wiersze z tabeli podstawowej, które spełniają kryteria wyboru określone w warunku wyszukiwania pełnotekstowego funkcji.

Zapytania korzystające z jednej z tych funkcji zwracają również wartość klasyfikacji istotności (RANK) i klucz pełnotekstowy (KEY) dla każdego zwracanego wiersza w następujący sposób:

  • kolumna KEY. Kolumna KEY zwraca unikatowe wartości zwracanych wierszy. Kolumna KEY może służyć do określania kryteriów wyboru.
  • kolumna RANK. Kolumna RANK zwraca wartość klasyfikacji dla każdego wiersza, która wskazuje, jak dobrze wiersz pasuje do kryteriów wyboru. Im wyższa wartość rangi tekstu lub dokumentu w wierszu, tym bardziej odpowiedni jest wiersz dla danego zapytania pełnotekstowego. Różne wiersze mogą być klasyfikowane identycznie. Liczbę zwracanych dopasowań można ograniczyć, określając opcjonalny parametr top_n_by_rank. Aby uzyskać więcej informacji, zobacz Ogranicz wyniki wyszukiwania za pomocą RANK.

więcej informacji. Aby uzyskać więcej informacji na temat składni i argumentów tych funkcji, zobacz CONTAINSTABLE i FREETEXTTABLE.

Określone typy wyszukiwań

Wyszukiwanie określonego wyrazu lub frazy (prosty termin)

Możesz użyć CONTAINS, CONTAINSTABLE, FREETEXTlub FREETEXTTABLE, aby wyszukać określony wyraz lub frazę. Jeśli na przykład chcesz wyszukać tabelę ProductReview w bazie danych AdventureWorks2022, aby znaleźć wszystkie komentarze dotyczące produktu z frazą "krzywa nauki", możesz użyć predykatu CONTAINS w następujący sposób:

USE AdventureWorks2022  
GO  
  
SELECT Comments  
FROM Production.ProductReview  
WHERE CONTAINS(Comments, '"learning curve"')  
GO  

Warunek wyszukiwania, w tym przypadku "krzywa uczenia", może być złożona i może składać się z jednego lub kilku terminów.

Więcej informacji na temat prostych wyszukiwań terminów

W wyszukiwaniu pełnotekstowym, wyraz (lub token) to ciąg, którego granice są identyfikowane przez odpowiednie dzielniki wyrazów, zgodnie z regułami językowymi określonego języka. Prawidłowa fraza składa się z wielu wyrazów z znakami interpunkcyjnymi lub bez nich.

Na przykład "croissant" to słowo, a wyrażenie "café au lait". Słowa i frazy, takie jak te, są nazywane prostymi terminami.

ZAWIERA i CONTAINSTABLE, aby znaleźć dokładne dopasowanie frazy. FREETEXT i FREETEXTTABLE podzielić frazę na osobne wyrazy.

Wyszukaj wyraz z prefiksem (termin prefiksu)

Do wyszukiwania wyrazów lub fraz z określonym prefiksem można użyć CONTAINS lub CONTAINSTABLE. Zwracane są wszystkie wpisy w kolumnie zawierającej tekst rozpoczynający się od określonego prefiksu. Aby na przykład wyszukać wszystkie wiersze zawierające prefiks top— tak jak w top``ple, top``pingi top. Zapytanie wygląda jak w poniższym przykładzie:

USE AdventureWorks2022  
GO  
  
SELECT Description, ProductDescriptionID  
FROM Production.ProductDescription  
WHERE CONTAINS (Description, '"top*"' )  
GO  

Wszystkie teksty zgodne z tekstem określonym przez gwiazdkę (*) są zwracane. Jeśli tekst i gwiazdka nie są rozdzielane podwójnym cudzysłowem, tak jak w CONTAINS (DESCRIPTION, 'top*')wyszukiwanie pełnotekstowe nie uwzględnia gwiazdki jako symbolu wieloznakowego.

Gdy termin prefiksu jest frazą, każdy token tworzący frazę jest traktowany jako oddzielny termin prefiksu. Zostaną zwrócone wszystkie wiersze zawierające wyrazy rozpoczynające się od terminów prefiksu. Na przykład termin z prefiksem "lekki chleb*" znajdzie wiersze z tekstem "lekko panierowany", "lekko chleb" lub "lekki chleb", ale nie zwróci "lekko opiekanego chleba".

Więcej informacji o wyszukiwaniach prefiksów

Termin prefiksu odnosi się do ciągu umieszczonego przed słowem w celu utworzenia wyrazu pochodnego lub formy odmienionej.

  • W przypadku pojedynczego terminu prefiksu każdy wyraz rozpoczynający się od określonego terminu będzie częścią zestawu wyników. Na przykład termin "auto*" pasuje do słów takich jak "automatyczny", "samochód" i tym podobne.

  • W przypadku frazy każde słowo w frazie jest uznawane za termin prefiksu. Na przykład termin "auto tran*" pasuje do "automatycznej przekładni" i "przetwornika samochodowego", ale nie pasuje do "automatycznej przekładni silnika".

Wyszukiwania prefiksów są obsługiwane przez CONTAINS i CONTAINSTABLE.

Wyszukiwanie form przegięcia określonego słowa (termin generowania)

Można użyć CONTAINS, CONTAINSTABLE, FREETEXTlub FREETEXTTABLE, aby wyszukać wszystkie różne czasy i koniugacje czasownika lub zarówno pojedyncze, jak i mnogie formy rzeczownika (wyszukiwanie deklinacyjne) lub synonimowe formy określonego słowa (wyszukiwanie tezaurusowe).

Poniższy przykład wyszukuje dowolną formę „foot” („foot”, „feet” itd.) w kolumnie Comments tabeli ProductReview w bazie danych AdventureWorks.

USE AdventureWorks2022  
GO  
  
SELECT Comments, ReviewerName  
FROM Production.ProductReview  
WHERE CONTAINS (Comments, 'FORMSOF(INFLECTIONAL, "foot")')  
GO  

Wyszukiwanie pełnotekstowe używa stemmerów, co pozwala wyszukiwać różne czasy i koniugacje czasownika, lub zarówno pojedyncze, jak i mnogie formy rzeczownika. Aby uzyskać więcej informacji na temat algorytmów stemmingowych, zobacz Konfiguracja i zarządzanie analizatorami składniowymi i algorytmami stemmingowymi dla wyszukiwania.

Więcej informacji o wyszukiwaniu terminów związanych z generacją

formy fleksyjne to różne czasy i koniugacje czasownika lub formy liczby pojedynczej i mnogiej rzeczownika.

Na przykład wyszukaj formę fleksyjną wyrazu "drive". Jeśli różne wiersze w tabeli zawierają wyrazy "drive", "drives", "drove", "driving" i "driven", wszystkie będą w zestawie wyników, ponieważ każdy z nich może być generowany fleksyjnie z wyrazu "drive".

FREETEXT i FREETEXTTABLE domyślnie wyszukują formy fleksyjne wszystkich określonych wyrazów. ZAWIERA i CONTAINSTABLE obsługują opcjonalny argument INFLECTIONAL.

Wyszukiwanie synonimów określonego słowa

tezaurus definiuje synonimy zdefiniowane przez użytkownika dla terminów. Aby uzyskać więcej informacji na temat plików tezaurusa, zobacz Configure and Manage Thesaurus Files for Full-Text Search.

Na przykład jeśli wpis "{samochód, samochód, ciężarówka, van}", zostanie dodany do tezaurusa, możesz wyszukać formę tezaurusa słowa "samochód". Wszystkie wiersze w tabeli, do których wykonano zapytanie, które zawierają wyrazy "automobile", "truck", "van" lub "car", pojawiają się w zestawie wyników, ponieważ każdy z tych słów należy do zestawu rozszerzeń synonimów zawierającego słowo "samochód".

FREETEXT i FREETEXTTABLE domyślnie używają tezaurusa. ZAWIERA i CONTAINSTABLE obsługują opcjonalny argument THESAURUS.

Wyszukiwanie wyrazu W POBLIŻU innego słowa

termin zbliżeniowy wskazuje wyrazy lub frazy położone blisko siebie. Można również określić maksymalną liczbę terminów, które nie są wyszukiwane, oddzielające pierwsze i ostatnie terminy wyszukiwania. Ponadto można wyszukiwać wyrazy lub frazy w dowolnej kolejności lub w kolejności, w jakiej je określisz.

Na przykład chcesz znaleźć wiersze, w których słowo "lód" znajduje się w pobliżu słowa "hokej" lub w których wyrażenie "łyżwiarstwo na lodzie" jest w pobliżu frazy "hokej na lodzie".

ZAWIERA i ZAWIERA TABELĘ

Aby uzyskać więcej informacji na temat wyszukiwania przybliżonego, zobacz Wyszukiwanie wyrazów blisko innego wyrazu z użyciem NEAR.

Wyszukiwanie wyrazów lub fraz przy użyciu wartości ważonych (termin ważony)

Możesz użyć CONTAINSTABLE, aby wyszukać wyrazy lub frazy i określić wartość ważoną. Waga mierzona jako liczba z zakresu od 0,0 do 1,0 wskazuje znaczenie każdego wyrazu i frazy w zestawie wyrazów i fraz. Waga 0,0 jest najniższa, a waga 1,0 jest najwyższa.

W poniższym przykładzie pokazano zapytanie, które wyszukuje wszystkie adresy klientów z użyciem wag, w którym dowolny tekst rozpoczynający się ciągiem "Bay" zawiera "Street" lub "View". Wyniki przyznają wyższą rangę tym wierszom, które zawierają więcej określonych wyrazów.

USE AdventureWorks2022  
GO  
  
SELECT AddressLine1, KEY_TBL.RANK   
FROM Person.Address AS Address INNER JOIN  
CONTAINSTABLE(Person.Address, AddressLine1, 'ISABOUT ("Bay*",   
         Street WEIGHT(0.9),   
         View WEIGHT(0.1)  
         ) ' ) AS KEY_TBL  
ON Address.AddressID = KEY_TBL.[KEY]  
ORDER BY KEY_TBL.RANK DESC  
GO  

Termin ważony może być używany w połączeniu z dowolnym prostym terminem, terminem z prefiksem, terminem generacyjnym lub terminem zbliżeniowym.

Więcej informacji o wyszukiwaniu terminów ważonych

W wyszukiwaniu ważonym terminem wartość ważona wskazuje stopień ważności dla każdego wyrazu i frazy w zestawie wyrazów i fraz. Wartość wagi 0,0 jest najniższa, a wartość wagi 1,0 jest najwyższa.

Na przykład w zapytaniu wyszukując wiele terminów, można przypisać każdemu wyrazowi wyszukiwania wartość wagi wskazującą jego znaczenie względem drugiego słowa w warunku wyszukiwania. Wyniki tego typu zapytania zwracają najpierw najbardziej odpowiednie wiersze zgodnie z względną wagą przypisaną do wyszukiwanych wyrazów. Zestawy wyników zawierają dokumenty lub wiersze zawierające dowolne z określonych terminów (lub zawartość między nimi); jednak niektóre wyniki będą uznawane za bardziej istotne niż inne ze względu na różnice w ważonych wartościach skojarzonych z różnymi wyszukiwanymi terminami.

Wyszukiwanie ważonych terminów jest obsługiwane przez CONTAINSTABLE.

Używanie operatorów AND, OR i NOT (operatory logiczne)

Zarówno predykat CONTAINS, jak i funkcja CONTAINSTABLE używają tych samych warunków wyszukiwania. Obie obsługują łączenie kilku terminów wyszukiwania przy użyciu operatorów logicznych — AND, OR i NOT — do wykonywania operacji logicznych. Możesz na przykład użyć funkcji AND, aby znaleźć wiersze zawierające zarówno "latte", jak i "bajgiel w stylu nowojorskim". Możesz na przykład użyć funkcji AND NOT, aby znaleźć wiersze zawierające "bajgiel", ale nie zawierające "sera śmietankowego".

Natomiast FREETEXT i FREETEXTTABLE traktują terminy logiczne jako wyrazy do wyszukania.

Aby uzyskać informacje na temat łączenia funkcji CONTAINS z innymi predykatami używającymi operatorów logicznych AND, OR i NOT, zobacz Warunek wyszukiwania (Transact-SQL).

Przykład

W poniższym przykładzie użyto predykatu CONTAINS, aby wyszukać opisy, w których identyfikator opisu nie jest równy 5, a opis zawiera zarówno słowo "Aluminium" jak i słowo "wrzeciono". Warunek wyszukiwania używa operatora logicznego AND. W tym przykładzie użyto tabeli ProductDescription bazy danych AdventureWorks2022.

USE AdventureWorks2022  
GO  
  
SELECT Description  
FROM Production.ProductDescription  
WHERE ProductDescriptionID <> 5 AND  
   CONTAINS(Description, 'aluminum AND spindle')  
GO  

Przypadek, stop słowa, język i tezaurus

Podczas pisania zapytań pełnotekstowych można również określić następujące opcje:

  • Wielkość liter. Zapytania wyszukiwania pełnotekstowego są niewrażliwe na wielkość liter. Jednak w języku japońskim istnieje wiele systemów fonetycznych, w których koncepcja normalizacji ortograficznej jest zbliżona do niewrażliwości na wielkość liter (na przykład kana = niewrażliwość na wielkość liter). Tego typu normalizacja ortograficzna nie jest obsługiwana.

  • Stopwords. Podczas definiowania zapytania pełnotekstowego silnik Full-Text odrzuca słowa kluczowe (zwane także wyrazami szumu) z kryteriów wyszukiwania. Stopwords to słowa takie jak "a", "and", "is" lub "the", które mogą występować często, ale zwykle nie pomagają w wyszukiwaniu określonego tekstu. Stopwords są wymienione w stopliście. Każdy indeks pełnotekstowy jest skojarzony z określoną listą wyrazów wykluczonych, która określa, jakie wyrazy są pomijane z zapytania lub indeksu w czasie indeksowania. Aby uzyskać więcej informacji, zobacz Konfiguracja i zarządzanie wyrazami wykluczającymi i listami wykluczającymi dla wyszukiwania Full-Text.

  • Language, z opcją LANGUAGE. Wiele terminów zapytania w dużym stopniu zależy od zachowania dzielenia wyrazów. Aby upewnić się, że używasz poprawnego podziału wyrazów (i stemmer) i pliku tezaurusa, zalecamy określenie opcji LANGUAGE. Aby uzyskać więcej informacji, zobacz Choose a Language When Creating a Full-Text Index (Wybieranie języka podczas tworzenia indeksu Full-Text).

  • Thesaurus. Zapytania FREETEXT i FREETEXTTABLE domyślnie używają tezaurusa. Funkcja CONTAINS i CONTAINSTABLE obsługuje opcjonalny argument THESAURUS. Aby uzyskać więcej informacji, zobacz Konfigurowanie i zarządzanie plikami tezaurusa dla Full-Text Wyszukiwanie.

Sprawdzanie wyników tokenizacji

Po zastosowaniu danego podziału wyrazów, tezaurusa i kombinacji listy zatrzymań w zapytaniu możesz zobaczyć, jak Full-Text Wyszukiwanie tokenizuje wyniki przy użyciu dynamicznego widoku zarządzania sys.dm_fts_parser. Aby uzyskać więcej informacji, zobacz sys.dm_fts_parser (Transact-SQL).

Zobacz też

CONTAINS (Transact-SQL)
CONTAINSTABLE (Transact-SQL)
FREETEXT (Transact-SQL)
FREETEXTTABLE (Transact-SQL)
Tworzenie Zapytania Wyszukiwania Full-Text (Visual Database Tools)
Popraw wydajność zapytań Full-Text