W poprzedniej lekcji była mowa o kolejności dokumentów. Nie można zobaczyć kolejności używając predykatu CONTAINS. Trzeba jako zwracany element otrzymać tabelę dokumentów oraz ich ranking. Taka tabela jest zwracana przez funkcje tablicowe CONTAINSTABLE i FREETEXTTABLE. Jeżeli zainstalowana jest baza wyszukiwania semantycznego  Semantic Language Statistics Database to można używać wyszukiwania semantycznego za pomocą trzech funkcji tablicowych: SEMANTICKEYPHRASETABLESEMANTICSIMILARITYDETAILSTABLESEMANTICSIMILARITYTABLE.

Użycie funkcji pełnotekstowych do wyszukiwania

Funkcje CONTAINSTABLE i FREETEXTTABLE zwracają dwie kolumny: KEY i RANK. Kolumna KEY jest unikalnym kluczem z indeksu pełnotekstowego (KEY INDEX z klauzuli tworzącej indeks). Kolumna RANK jest wartością z przedziału 0-1000, wartość ta jest rankingiem wyniku, im większa tym wynik bardziej pasuje do wyszukiwanej frazy. Wartość ta jest naliczana względem zapytania. naliczanie rankingu jest dosyć skomplikowane, SQL Serwer bierze pod uwagę częstotliwość wyszukiwanego słowa w dokumencie, wagę, liczbę zindeksowanych wierszy, bliskoznaczność i wiele innych. Obie funkcje naliczają ranking inaczej, ponieważ CONTAINSTABLE używa ważności parametrów jak wagi i odległość a FREETEXTTABLE nie.

Składnia Funkcji CONTAINSTABLE:

CONTAINSTABLE ( table , { column_name | ( column_list ) | * } , ' <contains_search_condition> ' [ , LANGUAGE language_term] [ , top_n_by_rank ] ) Wrunki wyszukiwania są takie same jak dla predykatu CONTAINS. Parametr top_n_by_rank ogranicza liczbę wierszy wynikowych do "n" wierszy z najwyższym rankingiem. ten parametr może być bardzo istotny dla wydajności ponieważ zapytanie może zwracać ogromną ilość wierszy.

Składnia Funkcji FREETEXTTABLE:

FREETEXTTABLE (table , { column_name | (column_list) | * } , 'freetext_string' [ , LANGUAGE language_term ] [ , top_n_by_rank ] ) Ważnym elementem jest language_term. Jest to język używany przez SQL Serwer do interpretacji form fleksyjnych wyrazów oraz korzystania z odpowiednich plików THESAURUS i list STOPWORDS, Jeżeli nie jest określony w zapytaniu to język kolumny indeksu pełnotekstowego zostanie użyty. Parametr ten jest ważny gdy w jednej kolumnie indeksu mogą się znajdować wartości  w wielu językach. Podanie języka w zapytaniu może zwiększyć jakość odnalezionych wyników. Język można podać jako wartość całkowitą LCID lub jako ciąg znakowy reprezentujący alias języka.  

Użycie funkcji semantycznych w wyszukiwaniu

Składnia Funkcji SEMANTICKEYPHRASETABLE:

SEMANTICKEYPHRASETABLE ( table, { column | (column_list) | * } [ , source_key ] ) Ta funkcja zwraca tabelę z kluczowymi frazami powiązanymi z kolumną indeksu pełnotekstowego dla listy kolumn z column_list. Parametr source_key jest unikalnym kluczem indeksu (KEY INDEX z instrukcji CREATE FULLTEXT INDEX). Jeżeli nie podamy klucza to SQL Serwer zwróci frazy dla każdego wiersza. * Wyszukiwanie semantyczne jest możliwe jedynie z użyciem funkcji tablicowych; nie wspiera ono żadnego predykatu dla klauzuli WHERE zapytania.

Składnia Funkcji SEMANTICSIMILARITYDETAILSTABLE:

SEMANTICSIMILARITYDETAILSTABLE ( table, source_column, source_key, matched_column, matched_key ) Ta funkcja zwraca tabelę z kluczowymi frazami które są wspólne dla dwóch dokumentów. Definiujemy dokument źródłowy jako parametr source_key (KEY INDEX) i kolumnę źródłową na której jest założony indeks source_column.

Składnia Funkcji SEMANTICSIMILARITYTABLE:

SEMANTICSIMILARITYTABLE ( table, { column | (column_list) | * }, source_key ) Ta funkcja zwraca tabelę z dokumentami ocenionymi wg podobieństwa semantycznego do dokumentu źródłowego wyznaczonego parametrem source_key. Ta funkcja pozwala znaleźć dokument najbardziej podobny do tego określonego.

Ćwiczenia

I. Użycie funkcji CONTAINSTABLE i FREETEXTTABLE w zapytaniach.

  1. Napisz zapytanie które używa funkcji CONTAINSTABLE w celu oceny wyszukiwania dokumentów dla słowa "data" lub "level" w kolumnie docexcerpt.
    SELECT D.id, D.title, CT.[RANK], D.docexcerpt
    FROM CONTAINSTABLE(dbo.Documents, docexcerpt, N'data OR level') AS CT
    INNER JOIN dbo.Documents AS D
    ON CT.[KEY] = D.id
    ORDER BY CT.[RANK] DESC;
  2. Napisz zapytanie które używa funkcji FREETEXTTABLE w celu oceny wyszukiwania dokumentów dla słowa "data" lub "level" w kolumnie docexcerpt. Porównaj wynik z poprzednim zapytaniem.
    SELECT D.id, D.title, FT.[RANK], D.docexcerpt
    FROM FREETEXTTABLE (dbo.Documents, docexcerpt, N'data level') AS FT
    INNER JOIN dbo.Documents AS D
    ON FT.[KEY] = D.id
    ORDER BY FT.[RANK] DESC;
  3. Napisz zapytanie które wylicza ranking dokumentów bazujący na wyszukaniu słów "data" i "level" w kolumnie docexcerpt. Słowu "data" nadaj wagę 0.8 a słowu "level" wagę 0.2.
    SELECT D.id, D.title, CT.[RANK], D.docexcerpt
    FROM CONTAINSTABLE(dbo.Documents, docexcerpt, N'ISABOUT(data weight(0.8), level weight(0.2))') AS CT
    INNER JOIN dbo.Documents AS D
    ON CT.[KEY] = D.id
    ORDER BY CT.[RANK] DESC;
  4. Napisz zapytanie które wylicza ranking dokumentów bazujący na wyszukaniu słów "data" i "row" w kolumnie docexcerpt. Słowa muszą być bliżej niż 30 fraz od siebie.
    SELECT D.id, D.title, CT.[RANK]
    FROM CONTAINSTABLE (dbo.Documents, doccontent, N'NEAR((data, row), 30)') AS CT
    INNER JOIN dbo.Documents AS D
    ON CT.[KEY] = D.id
    ORDER BY CT.[RANK] DESC;

II. Użycie funkcji semantycznych SEMANTICKEYPHRASETABLE, SEMANTICSIMILARITYDETAILSTABLE i SEMANTICSIMILARITYTABLE

  1. Napisz zapytanie które pobierze 20 najbardziej ważnych semantycznie fraz z dokumentów w kolumnie doccontent.
    SELECT TOP (20)
    D.id, D.title, SKT.keyphrase, SKT.score
    FROM SEMANTICKEYPHRASETABLE (dbo.Documents, doccontent) AS SKT
    INNER JOIN dbo.Documents AS D
    ON SKT.document_key = D.id
    ORDER BY SKT.score DESC;
  2. Napisz zapytanie które zwraca dokumenty posortowane wg semantycznego podobieństwa do dokumentu z ID równym 1 dla kolumny doccontent.
    SELECT SST.matched_document_key,D.title, SST.score
    FROM SEMANTICSIMILARITYTABLE(dbo.Documents, doccontent, 1) AS SST
    INNER JOIN dbo.Documents AS D
    ON SST.matched_document_key = D.id
    ORDER BY SST.score DESC;
  3. Napisz zapytanie które wyszuka frazy które są wspólne dla dokumentów z ID równym 1 i 4 dla kolumny doccontent. Uporządkuj wynik wg wyniku podobieństwa.
    SELECT SSDT.keyphrase, SSDT.score
    FROM SEMANTICSIMILARITYDETAILSTABLE(dbo.Documents, doccontent, 1,doccontent, 4) AS SSDT
    ORDER BY SSDT.score DESC;

Podsumowanie

  1. Funkcje wyszukiwania pełnotekstowego są użyteczne dla oceniania wyników wyszukiwania.
  2. Funkcje wyszukiwania semantycznego dają wgląd w dokumenty. Dzięki nim można znaleźć frazy kluczowe oraz porównywać dokumenty.