2009.07_Full-Text Search _[Bazy Danych].pdf

(833 KB) Pobierz
441074752 UNPDF
Bazy danych
Full-Text Search
Wyszukiwanie pełnotekstowe w SQL Server 2005/2008
Korzystając z oferowanych przez większość portali, sklepów czy zwykłych
stron internetowych wyszukiwarek, często chcielibyśmy móc zadać bardziej
skomplikowane zapytanie, które sprawdzi formy fleksyjne szukanego słowa
lub przeszuka zawartość dokumentów tekstowych. Operacje takie nazywane
są wyszukiwaniem pełnotekstowym i im właśnie poświęcony jest ten artykuł.
Dowiesz się:
• Jak uruchomić i skonigurować usługę Full-
Text Search;
• Co to jest wyszukiwanie pełnotekstowe;
• Jak szukać informacji wewnątrz plików PDF.
Powinieneś wiedzieć:
• Podstawy języka SQL;
• Podstawowa obsługa serwera SQL Server
2005/2008;
• Instalacja przykładowej bazy AdventureWorks.
kich przypadkach silnik bazy danych wykonu-
je szukanie słowa w tabeli wiersz po wierszu —
nie trzeba chyba tłumaczyć, jak powolne i mało
wydajne jest to w przypadku dużych — giga- lub
terabajtowych — tabel. To tak jakbyśmy szukali
w książce adresowej osób o imieniu Jan. Książ-
ka adresowa nie jest zindeksowana po pierw-
szym imieniu, a zatem musielibyśmy przejrzeć
wszystkie jej strony.
Zatem skoro T-SQL nie dostarcza użytkowni-
kom wydajnych narzędzi do szukania informacji
w bazie danych, istnieje potrzeba wykorzystania
innego i lepszego rozwiązania, jakim jest niewąt-
pliwie mechanizm Full-Text Search ( FTS ).
FTS to „silnik” do szybkiego wyszukiwania
danych tekstowych w bazie danych. Usługa ta
była dostępna już w SQL Server 2000, jednak
w najnowszych wersjach zawiera wiele ulep-
szeń. Działanie usługi FTS opiera się na budo-
waniu indeksów dla każdego znaczącego słowa
lub wyrażenia zapisanego w bazie, co rozwiązu-
je problem wydajności wyszukiwania tekstu. Po-
nadto wykorzystując usługę FTS, mamy możli-
wość szukania:
Poziom trudności
np. jeśli interesuje nas informacja o artykule, któ-
rego tytuł zawiera tekst Full-Text Search , to
zapytanie SQL może wyglądać mniej więcej tak:
N ikogo chyba nie zdziwi, jeśli napiszę, że
SELECT * FROM Articles WHERE Title LIKE
‘%Full-Text Search%’
operacja wyszukiwania informacji jest
chyba najczęściej wykonywanym ty-
pem zapytania w bazach danych. Żaden progra-
mista aplikacji bazodanowych nie wyobraża so-
bie realizacji wymagań biznesowych bez stoso-
wania klauzuli WHERE w pisanych przez siebie
poleceniach SQL.
O ile początkowo bazy danych wykorzystywa-
ne były do przechowywania małych i prostych
danych, to obecnie większość aplikacji w całości
działa w oparciu o bazy danych, przechowując w
nich wszystkie niezbędne dane zawierające ta-
kie duże ilości danych. Coraz częściej w dużych
korporacjach, ale nie tylko, spotykane i stosowa-
ne są systemy służące do przechowywania w ba-
zach danych całych dokumentów. Tak naprawdę
końcowych użytkowników aplikacji nie intere-
suje, jaki mechanizm wyszukiwania informacji
w bazie danych został wykorzystany w urucha-
mianych przez nich funkcjonalnościach. Ocze-
kują oni od takich rozwiązań przede wszystkim
łatwego dostępu do zawartości baz danych.
Wykorzystując podstawową składnię języka T-
SQL, mamy możliwość wyszukiwania informa-
cji dzięki operatorom porównania i LIKE . Nie-
stety, mają one pewne wady, o których z pewno-
ścią przekonał się niejeden programista baz da-
nych. Przede wszystkim są one użyteczne tylko
wtedy, kiedy wiemy dokładnie, czego szukamy,
Jednak T-SQL nie zawsze zwraca to, czego tak
naprawdę moglibyśmy sobie życzyć. Załóżmy,
że w naszej tabeli istnieje rekord, który w ko-
lumnie Title zawiera tekst Full Text Search .
Powyższe zapytanie nie zwróci tego rekordu,
gdyż wspomniany tekst zawiera spację zamiast
myślnika — a na taką ewentualność nie byli-
śmy przygotowani. Tak naprawdę wystarczyła-
by dodatkowa spacja między szukanymi słowa-
mi, żeby dany rekord nie został zwrócony. Ma-
jąc taką wiedzę, możemy to zapytanie sformu-
łować inaczej:
• słów, które występują w tekście blisko
siebie;
• z wykorzystaniem wieloznaczników (ang.
wildcards );
• uwzględniającego formy fleksyjne wyrazów
(np. search, searching, searched);
• z wykorzystaniem ważenia słów (jedno sło-
wo jest ważniejsze w szukanym tekście niż
inne);
• z wykorzystaniem tezaurusa..
SELECT * FROM Articles WHERE Title LIKE
‘%Full%Text%Search%’
Jednak to rozwiązanie także nie jest doskona-
łe, gdyż jego rezultaty są uzależnione od kolej-
ności występowania słów po sobie — zgodnie
z kolejnością w zapytaniu. Pomijając kwestię
utrzymania i złożoności, potencjalne rozwią-
zania tego problemu mają jeszcze jedną, dość
istotną wadę — niską wydajność. Silnik bazy da-
nych jest w stanie wykorzystywać indeksy tabel
podczas szukania informacji w bazie tylko wte-
dy, gdy przeszukiwanie odbywa się „od począt-
ku słowa”, a zatem o ile zapytanie LIKE 'word%'
wykonuje się całkiem szybko, to instruk-
cja LIKE '%word%' jest bardzo wolna. W ta-
W SQL Server 2005/2008 każda instancja ser-
wera ma jedną dedykowaną instancję silni-
ka Microsoft Full-Text Search (procesu MSFTE-
SQL ). W SQL Server 2005 wprowadzono no-
we polecenia języka T-SQL związane z obsłu-
gą FTS. Zastępują one używane we wcześniej-
szych wersjach serwera procedury, np. sp _
fulltext _ catalog , sp _ fulltext _ column .
54
07/2009
441074752.042.png 441074752.043.png 441074752.044.png 441074752.045.png 441074752.001.png 441074752.002.png 441074752.003.png 441074752.004.png 441074752.005.png 441074752.006.png
Full-Text Search
Polecenia te umożliwiają wyszukiwanie infor-
macji oraz tworzenie, modyfikowanie, usuwa-
nie katalogów i indeksów typu FTS. Obiek-
ty te są podstawą funkcjonowania usługi FTS,
i o nich będziemy mówić w dalszej części ar-
tykułu.
Zanim jednak przystąpimy do tworzenia kata-
logu FTS, musimy się upewnić, czy w bazie da-
nych, którą chcemy wykorzystywać (w naszym
przypadku jest to AdventureWorks ), jest włączo-
na obsługa funkcjonalności FTS. W tym celu:
powiednie polecenie SQL. W pierwszej opcji w
oknie SSMS przechodzimy do gałęzi Databases
–> AdventureWorks –> Storage –> Full Text Ca-
talogs , a następnie z menu kontekstowego wy-
bieramy opcję New Full-Text Catalog . W no-
wym oknie (Rysunek 1) wypełniamy następu-
jące pola:
Opisy składni poleceń SQL tworzących i mody-
fikujących katalog FTS zostały zawarte w ram-
ce. Niewątpliwie polecenie do tworzenia kata-
logu FTS daje nam więcej możliwości niż opcja
graficzna.
Ważna informacja jest taka, że katalogu FTS
nie można tworzyć na następujących bazach da-
nych: master, model , tempdb . Ponadto użytkow-
nik, który wykonuje to polecenie, musi posiadać
nadane prawo CREATE FULLTEXT CATALOG
do bazy danych, w której chce tworzyć katalog
FTS, lub być członkiem jednej z ról: db_owner ,
db_ddladmin .
Listę wszystkich utworzonych w bazie da-
nych katalogów FTS otrzymamy, wykonując po-
lecenie
Full-text catalog name – nazwa tworzonego
katalogu FTS;
Owner – użytkownik lub rola SQL Server
– właściciel katalogu;
Set as default catalog – czy tworzony kata-
log stanie się domyślnym katalogiem dla
tworzonych w następnej kolejności indek-
sów;
Accent sensitivity – czy tworzony katalog bę-
dzie czuły na znaki diakrytyczne.
• z poziomu SQL Server Management Studio
( SSMS ) z menu kontekstowego bazy da-
nych AdventureWorks wybieramy opcję Pro-
perties;
• przechodzimy na zakładkę Files;
• upewniamy się, że jest zaznaczona opcja
Use full-text indexing .
SELECT * FROM sys.fulltext_catalogs
Mamy także możliwość sprawdzenia tych usta-
wień z poziomu kodu T-SQL. Posłużymy się
poleceniem:
Tworzenie i modyikowanie katalogu FTS
CREATE FULLTEXT CATALOG catalog_name
[ON FILEGROUP 'ilegroup']
[IN PATH 'rootpath']
[WITH ACCENT_SENSITIVITY = {ON|OFF}]
[AS DEFAULT]
[AUTHORIZATION owner_name ]
SELECT DATABASEPROPERTYEX('AdventureWorks',
'IsFulltextEnabled')
Zapytanie zwraca wartość 1, jeśli FTS jest włą-
czone, w przeciwnym razie zwracana jest
wartość 0. Do włączania i wyłączania obsłu-
gi FTS w bazie danych służy procedura sp _
fulltext _ database , która przyjmuje tylko
dwa parametry: enable lub disable . Aby włą-
czyć FTS, wykonujemy polecenie:
catalog_name – unikalna w bazie danych nazwa tworzonego katalogu o długości nieprze-
kraczającej 120 znaków.
ON FILEGROUP 'ilegroup' – opcja ta dotyczy tylko SQL Server 2005 i określa nazwę grupy pli-
ków dostępnej w SQL Server, do której nowy katalog będzie przypisany. Jeśli parametr ten
nie będzie podany, wówczas nowy katalog będzie przypisany do domyślnej grupy plików
powiązanej z katalogami FTS. Katalogi FTS w grupach plików są traktowane jak pliki, a ich
izyczna lokalizacja na dyski jest określana w kolumnie physical_name w systemowej tabeli
sys.master_iles . Nazwy plików, które są tworzone dla katalogów FTS, są nadawane zgodnie z
konwencją „sysft_” & nazwa_katalog. Przykładowo: do utworzonego wcześniej w kreatorze
katalogu FULLTEXT _ CAT _ 01 przypisany zostanie plik sysft_FULLTEXT_CAT_01 . W SQL Se-
rver 2008 opcja ta jest dostępna, ale nie ma wpływu na tworzenie katalogu FTS – przypisa-
nie FTS do plików odbywa się na etapie tworzenia indeksów FTS (opisanego w dalszej części
artykułu).
IN PATH 'rootpath' – katalog, w którym zostanie zapisany katalog. Jeśli parametr ten nie bę-
dzie podany, katalog zostanie zapisany w domyślnej lokalizacji: SQL_SERVER_INSTALL_
DIRECTORY}\MSSQL\FTData\FULLTEXT_CAT_01 . Podana lokalizacja musi odwoływać się do lo-
kalnego dysku serwera. Próba zapisu katalogu na dysku sieciowym, napędzie USB itp. nie
powiedzie się.
ACCENT_SENSITIVITY = {ON|OFF} – określa, czy katalog jest wrażliwy na tzw. znaki diakry-
tyczne. Warto pamiętać, że jeśli w przyszłości parametr ten zostanie zmieniony, to kata-
log musi zostać przebudowany. Domyślnie wykorzystywane jest ustawienie przypisane
do bazy danych, w której katalog jest tworzony (można to sprawdzić w tabeli systemowej
sys.databases ).
AS DEFAULT – określa, czy tworzony katalog będzie domyślnym dla wszystkich indeksów,
które w następnej kolejności będą tworzone.
AUTHORIZATION owner_name – określa właściciela katalogu FTS. Może to być użytkownik
bazy danych lub rola.
sp_fulltext_database ‘enable’
Próby wykonywania poleceń T-SQL związa-
nych z FTS przy wyłączonej obsłudze tej funk-
cjonalności w bazie danych skończyłyby się ko-
munikatem o błędzie:
Msg 7616, Level 16, State 100, Line 1
Full-Text Search is not enabled for the cur-
rent database. Use sp_fulltext_database to ena-
ble full-text search for the database. The func-
tionality to disable and enable full-text search
for a database is deprecated. Please change your
application.
Katalogi FTS
W celu wykorzystania FTS musimy w pierw-
szym kroku utworzyć katalog FTS. Obiekt ten
stanowić będzie zbiór indeksów typu FTS. Zasa-
da przypisania/wykorzystania katalogów FTS w
tabelach jest następująca: każdy katalog FTS mo-
że przechowywać wiele indeksów powiązanych
z wieloma tabelami, ale każda tabela może być
powiązana tylko z jednym katalogiem. Zazwy-
czaj jeden katalog będzie obsługiwał szukanie ty-
pu FTS dla całej bazy danych. Jednak ze wzglę-
dów wydajnościowych zaleca się dedykowanie
oddzielnego katalogu dla dużych tabel.
Katalog FTS możemy utworzyć, wykorzy-
stując do tego interfejs graficzny lub pisząc od-
ALTER FULLTEXT CATALOG catalog_name
{ REBUILD [WITH ACCENT_SENSITIVITY = {ON|OFF} ]
| REORGANIZE
| AS DEFAULT }
REBUILD – przebudowa katalogu całkowicie od nowa. Aktualnie wykorzystywany plik na
dysku jest usuwany, a na jego miejsce tworzony nowy. Wszystkie ustawienia katalogu są
zapamiętywane. Podczas przebudowy katalog nie jest dostępny dla użytkowników. Jak już
wcześniej pisałem, przebudowa katalogu jest niezbędna w przypadku zmiany wrażliwości
na tzw. znaki diakrytyczne.
REORGANIZE – proces podobny do REBUILD, ale nie usuwa pliku, tylko go optymalizuje i de-
fragmentuje. Proces ten nazywany jest master merge , co oznacza, że mniejsze indeksy są lo-
gicznie układane w jeden duży w celu zwiększenia wydajności.
AS DEFAULT – ustawia katalog domyślnym dla tworzonych indeksów.
www.sdjournal.org
55
441074752.007.png 441074752.008.png 441074752.009.png 441074752.010.png 441074752.011.png 441074752.012.png 441074752.013.png 441074752.014.png 441074752.015.png 441074752.016.png 441074752.017.png
Bazy danych
Do usuwania katalogów FTS wraz z powiąza-
nymi z nimi plikami na dysku służy polece-
nie DROP FULLTEXT CATALOG , które przyjmu-
je tylko jeden parametr – nazwę katalogu, któ-
ry chcemy usunąć. Warto zwrócić uwagę, że
w przypadku usuwania katalogu domyślnego
otrzymamy odpowiedni komunikat.
niego polecenia T-SQL. W poniższym przy-
kładzie zademonstruję, w jaki sposób można
utworzyć indeks FTS na tabeli HumanResourc
es.JobCandidate :
Automatically – indeks jest aktualizo-
wany przy każdej zmianie w tabeli. Jest
to najszybsza i najłatwiejsza metoda
utrzymywania aktualnego indeksu;
Manually – zmiany w tabeli są śledzo-
ne, ale indeks nie jest automatycznie
aktualizowany. Jego aktualizacja musi
być uruchomiona ręcznie przez admi-
nistratora bazy danych;
Do not track changes – zmiany w tabeli
nie są śledzone. W momencie ręcznej
aktualizacji indeksu FTS musi on od-
czytać zawartość całej tabeli, żeby wy-
kryć wszystkie zmiany.
• Wybieramy Automatically i klikamy Next.
• W oknie Select Catalog, Index Filegroup and
Stoplist musimy określić trzy opcje:
• w SSMS przechodzimy do gałęzi Databases
–> AdventureWorks –> Tables –> HumanRe-
sources.JobCandidate;
• z menu kontekstowego wybieramy opcję
Full-Text Index –> Define Full-Text Index;
• w oknie Select an index wybieramy PK_
JobCandidate_JobCandidate_ID i klikamy
Next;
• w oknie Select Table Columns musimy okre-
ślić, do której kolumny (ew. kilku kolumn)
ma odnosić się tworzony indeks. Kreator
analizuje typy kolumn i wyświetla te, na
których indeks FTS może zostać założo-
ny. Typy kolumn obsługiwane przez indek-
sy FTS to: char , varchar , nvarchar , text , ntext ,
xml , varbinary i image . Dodatkowo w ko-
lumnie Language for Word Breaker możemy
wybrać język, w którym zapisane są dane.
Zaznaczamy pole wyboru obok kolumny
Resume, następnie wybieramy English dla
języka zawartości i klikamy Next;
• w oknie Select Change tracking decydu-
jemy, kiedy zmiany w zawartości tabeli
mają być uwzględnione w tworzonym
przez nas indeksie. Mamy następujące
opcje:
Indeksy FTS
Kiedy mamy już utworzony katalog FTS, może-
my przystąpić do tworzenia indeksów. Na po-
czątku jednak kilka uwag:
• każda tabela, dla której chcemy utworzyć
indeks FTS, musi posiadać unikalny, nie-
pusty indeks utworzony na pojedynczej ko-
lumnie. W większości przypadków naszym
wyborem będzie klucz główny tabeli;
• tylko jeden indeks FTS może być przypi-
sany do pojedynczej tabeli (w przeciwień-
stwie do normalnych indeksów dostępnych
w SQL Server 2005/2008) . Oznacza to, że
każda kolumna, na podstawie której będzie
wykonywane szukanie FTS, musi być czę-
ścią indeksu;
• indeksy FTS mogą obsługiwać tylko tabele
użytkowników (nie są obsługiwane perspek-
tywy, tabele tymczasowe i systemowe).
wybrać katalog FTS, do którego przypisany bę-
dzie tworzony indeks (wybieramy utworzony
wcześniej katalog FULLTEXT _ CAT _ 01 ). Może-
my także w tym miejscu utworzyć nowy kata-
log FTS;
• przypisać indeks do grupy plików bazy da-
nych – zalecane jest przechowywanie da-
nych tabeli i jej indeksu FTS w tej samej
grupie plików. Można zastanawiać się nad
ich rozdzieleniem tylko wówczas, jeśli
chcemy zoptymalizować wydajność ope-
racji I/O na danej tabeli. Zaznaczamy <de-
fault>;
• przypisać indeks do tzw. stoplist – jest to
nowe w SQL Server 2008 podejście do te-
matu tzw. noisy words , o którym napiszę w
dalszej części artykułu. Możemy przyjąć za-
łożenie, że dla naszej tabeli wykorzystamy
domyślny – systemowy zbiór noisy words
(zaznaczamy <system> ). Klikamy Next.
• W oknie Define Population Schedules mo-
żemy określić harmonogram aktualizacji
tworzonego indeksu lub katalogu. Pomija-
my ten krok i klikamy Next – inny sposób
aktualizacji indeksu poznamy w dalszej
części rozdziału. Jeśli jednak z ciekawo-
ści zdecydujemy się na zaplanowanie har-
monogramu aktualizacji indeksu, musi-
my kliknąć przycisk New Catalog Schedu-
le . W nowym oknie należy wpisać nazwę
harmonogramu oraz określić czas oraz
częstotliwość uruchamiania procesu ak-
tualizacji katalogu. Pamiętajmy, że często-
tliwość aktualizacji indeksu i katalogu za-
leży w głównej mierze od częstości zmian
danych w tabelach. Jeśli dane zmieniają
się często, to aktualizacja także powinna
odbywać się często. Podczas ustalania har-
monogramu należy także wziąć pod uwa-
gę obciążenie SQL Servera w określonych
porach dnia. Lepiej nie uruchamiać aktu-
alizacji indeksów FTS na dużych tabelach
w godzinach największego wykorzystania
serwera.
• W ostatnim oknie kreator wyświetla pod-
Ponownie do tworzenia indeksów FTS może-
my użyć interfejsu graficznego lub odpowied-
Rysunek 1. Okno New Full-Text Catalog
Rysunek 2. Wynik polecenia CONTAINSTABLE
56
07/2009
441074752.018.png 441074752.019.png 441074752.020.png 441074752.021.png 441074752.022.png 441074752.023.png 441074752.024.png
 
Full-Text Search
sumowanie dokonanych wyborów. Klika-
my Finish , indeks FTS jest tworzony.
• Indeks został utworzony, ale nie zawiera
nadal żadnych informacji. Aby zaktuali-
zować i zapełnić danymi utworzony przed
chwilą indeks, z menu kontekstowego ta-
beli HumanResources.JobCandidate wy-
bieramy Full-Text Index –> Start Full Popu-
lation . Czas trwania procesu indeksowania
zależy głównie od ilości danych zapisanych
w tabeli.
• Opisy składni poleceń SQL tworzących i
modyfikujących indeks FTS zostały zawar-
te w ramce. Do usuwania indeksów FTS
służy polecenie DROP FULLTEXT INDEX ,
które przyjmuje tylko jeden parametr – na-
zwę tabeli, z której chcemy usunąć indeks.
Poniższe polecenie utworzy nową listę ( nowaLi-
sta ) na podstawie systemowej, a następnie doda
do niej nowe słowo dla języka angielskiego.
Jeśli starczyłoby nam wytrwałości, to po
przejrzeniu pozostałych rekordów tej tabe-
li przekonalibyśmy się, że w kilku występu-
ją inne formy słowa replace, jednak nie zo-
stały one zwrócone jako wynik zapytania,
gdyż szukane było dokładne wystąpienie te-
go słowa. W powyższym zapytaniu wyko-
rzystano warunek OR , który umożliwił szu-
kanie wierszy zawierających jedno lub drugie
szukane słowo. Inne dostępne operatory to:
AND , AND NOT .
Używając polecenia CONTAINS, mamy
możliwość skorzystania z tzw. wieloznaczni-
ków (ang. wildcards ). Ważne w tym przypadku
są następujące uwagi:
CREATE FULLTEXT STOPLIST myStoplist FROM
SYSTEM STOPLIST;
ALTER FULLTEXT STOPLIST MyStoplist ADD 'en'
LANGUAGE 'English';
Wyszukiwanie informacji
Do szybkiego wyszukiwania danych tekstowych
z wykorzystaniem usługi Full-Text Search służą
cztery polecenia: CONTAINS , CONTAINSTA-
BLE , FREETEXT , FREETEXTTABLE .
Polecenie CONTAINS
Polecenie CONTAINS wykorzystujemy do wy-
szukiwania:
• szukanie z wykorzystaniem wieloznacz-
ników jest wykonywane przez oddziel-
ny proces FTS,a nie przez SQL Server. W
związku z tym obowiązują oznaczenia
wieloznaczników wykorzystywane w sys-
temie operacyjnym: „*” i „?” (a nie w SQL
Server: „%”, „_”);
• możemy wykorzystywać wieloznaczni-
ki tylko na końcu wyrazów, a nie na po-
czątku;
• użycie znacznika w sposób następujący:
CONTAINS (*,He pulled out the thorn*) jest
równoznaczne z poleceniem CONTAINS
(*,He* pulled* out* the* thorn*) ;
• słowa, po których występuje wieloznacz-
nik, muszą być umieszczone w cudzysło-
wie. W przeciwnym wypadku SQL Server
będzie interpretował gwiazdkę jako szuka-
ny symbol.
Stoplist – Noisy Words
Podczas tworzenia indeksu FTS wspomniałem
o stoplist i noisy words . Dowiedzmy się, o co w
tym chodzi. W każdym języku występują wy-
razy, które są bardzo często używane w mo-
wie i piśmie, a które nie są znaczące dla całego
przekazu. W języku angielskim są to np. he, it,
a, the, on, for, itp. Wyrazy te określamy z ang.
Noisy Words . Aby wyszukiwanie typu FTS było
jak najbardziej efektywne, wyrazy te nie powin-
ny być indeksowane. W przypadku SQL Server
2005 w katalogu {SQL_SERVER_INSTALL_
DIRECTORY}\MSSQL\MSSQL\FTData prze-
chowywane są pliki zawierające Noisy Words wy-
stępujące w danym języku, np. do języka U.S. i
English przypisany jest plik noiseENU.txt . Noisy
Words języka polskiego zapisane są w pliku noise-
PLK . W zależności od potrzeb mamy możliwość
dopisywać i usuwać wyrazy z tych plików, np. je-
śli prowadzimy biuro podróży i przechowujemy
informacje o nim w bazie danych, to prawdopo-
dobnie słuszne będzie dodanie słowa Travel (z
ang. podróż) do pliku noiseENU.txt – prawdopo-
dobnie słowo to wystąpi wielokrotnie w naszych
danych. Pamiętajmy, że edycja plików NoisyFiles
wymaga zatrzymania i ponownego uruchomie-
nia usługi Full-Text Search .
W przypadku SQL Server 2008 nazwa noisy
została zmieniona na stop . Wyrazy zaś nie są już
zapisywane w plikach na dysku, ale grupowane
w tzw. stoplist i przechowywane w bazie danych.
Do tworzenia stoplist służy polecenie, którego
najprostsza wersja jest następująca:
• słów lub wyrażeń;
• przedrostka słowa lub wyrażenia;
• słów, które występują w tekście stosunko-
wo blisko siebie;
• słów będących odmianami fleksyjnymi szu-
kanego słowa;
• słów będących synonimami innych;
• z wykorzystaniem tezaurusa;
• z ważeniem szukanych słów (jedno szukane
słowo jest ważniejsze w tekście niż inne).
Domyślnie wyszukiwane są dokładne wystąpie-
nia szukanego słowa: jeśli szukany wyraz to np.
load, to słowo loaded nie zostanie zwrócone w
rezultatach wyszukiwania. Dopiero wykorzystu-
jąc dodatkowe opcje, można rozszerzyć wyszuki-
wanie o formy fleksyjne. Polecenie CONTAINS
przyjmuje dwa parametry: pierwszy określa ko-
lumnę, w której będziemy szukać informacji (je-
śli chcemy szukać we wszystkich zindeksowa-
nych kolumnach, możemy użyć znacznika *), zaś
drugi parametr pozwala określić dodatkowe wa-
runki wyszukiwania. Poniższe polecenie zwraca
wszystkie wiersze z tabeli Production.Document ,
które w kolumnie DocumentSummary zawierają
słowa replace lub component .
SELECT * FROM Production.Document
WHERE CONTAINS (DocumentSummary,
'"import*"' )
Często istnieje potrzeba wyszukiwania in-
formacji w tekście, w którym konkretne sło-
wa występują blisko siebie. Mechanizm FTS
dostarcza takiej możliwości poprzez zasto-
sowanie słowa kluczowego NEAR . Spraw-
dza ono bliskość szukanych słów w tekście
i jeśli występują one stosunkowo blisko sie-
bie (odległość ok. 30 słów), dany wiersz jest
zwracany. Poniższy przykład wyszukuje
wiersze, w których blisko siebie występują
SELECT DocumentID, DocumentSummary
FROM Production.Document
WHERE CONTAINS (DocumentSummary, '"replace"
OR "component"' )
CREATE FULLTEXT STOPLIST stoplist_name
[ FROM { [ database_name. ] source_
stoplist_name } | SYSTEM STOPLIST ]
Musimy określić następujące parametry:
stoplist_name – nazwa;
database_name . source_stoplist_name – źró-
dłowa lista, na podstawie której utworzy-
my swoją własną;
SYSTEM_STOPLIST – oznacza, że nowa
lista opiera się na systemowej/domyślnej.
Rysunek 3. Wynik wczytania pliku PDF do bazy danych
www.sdjournal.org
57
441074752.025.png 441074752.026.png 441074752.027.png 441074752.028.png 441074752.029.png 441074752.030.png 441074752.031.png 441074752.032.png 441074752.033.png 441074752.034.png
Bazy danych
słowa replace , instructions oraz te zaczy-
nające się na rel .
Internet Explorer . Poniższy przykład zwraca
wszystkie wiersze, w których znajdują się słowa
IE, IE5 , Internet Explorer :
to, że powyższe zapytanie z użyciem polecenia
FREETEXT daje identyczne rezultaty, jak opi-
sane wcześniej zapytanie z użyciem polecenia
CONTAINS z opcją FORMSOF INFLECTIO-
NAL . Istnieją dwie różnice: szukając kilku słów
lub wyrażenia za pomocą FREETEXT nie mu-
simy stosować operatorów ( AND , OR , AND
NOT ) – wystarczy, że wpiszemy cały szukany
tekst, ponadto polecenie FREETEXT automa-
tycznie wykorzystuje pliki tezaurusa.
SELECT * FROM Production.Document
WHERE CONTAINS (DocumentSummary, 'replace
NEAR instructions NEAR "refl*"')
SELECT * FROM Table WHERE CONTAINS(*,’FORMSO
F(Thesaurus,”IE”)’)
Do wyszukiwania form fleksyjnych wyrazów
wykorzystujemy słowo kluczowe FORMSOF ,
po którym w nawiasie występuje słowo klu-
czowe INFLECTIONAL. W poniższym przy-
kładzie zwrócone zostaną wszystkie wiersze,
w których występują fleksyjne formy słowa
replace (np. replace , replacing , replacement , re-
placed ).
Jeśli w jednym zapytaniu szukamy wielu słów,
to zazwyczaj mają one różne znaczenie dla
oczekiwanych przez nas rezultatów tego szu-
kania, np. jedno słowo musi wystąpić w szuka-
nym tekście (jest dla nas istotne – ma dla nas
dużą wagę), inne zaś może wystąpić, ale nie
musi (jego waga jest mniejsza). Mechanizm
FTS umożliwia wyszukiwanie z uwzględnie-
niem wagi słów. Służy do tego operator ISA-
BOUT . Wagi słów mogą przyjmować wartości z
przedziału 0.0 do 1.0.
W poniższym przykładzie wyszukiwane są
wystąpienia słów bicyle i seat . Pierwszemu
przypisana jest waga 0.9, drugiemu 0.1).
Polecenie CONTAINSTABLE
Polecenie CONTAINSTABLE w kwestii zwra-
canych wyników jest identyczne jak polece-
nie CONTAINS . Różnica między nimi polega
na sposobie zwracania wyników. Jak już wie-
my, polecenie CONTAINS zwraca tak napraw-
dę boolowską informację dotyczącą danego za-
pytania i wiersza. Jeśli polecenie zwraca wartość
true (szukane słowo lub wyrażenie zostało znale-
zione w danym wierszu), to wiersz ten zwracany
jest jako wynik zapytania. Polecenie CONTAIN-
STABLE jako wynik zwraca tabelę składającą się
z dwóch kolumn:
SELECT * FROM Production.Document
WHERE CONTAINS(DocumentSummary, '
FORMSOF (INFLECTIONAL, replace) ')
Do wyszukiwania z wykorzystaniem tezauru-
sa używamy poznanego w poprzednim przy-
kładzie słowa kluczowego FORMSOF z opcją
THESAURUS . Umożliwia ono wyszukiwa-
nie słów na podstawie ich synonimów. Pli-
ki z synonimami dla poszczególnych języków
obsługiwane przez SQL Server 2005 znajdu-
ją się w katalogu {SQL_SERVER_INSTALL_
DIRECTORY}\MSSQL\MSSQL\FTData\ ,
np. dla języka angielskiego plik synonimów ma
nazwę tsENG.xml . Pliki te mają format XML i
zawierają dwa główne typy gałęzi:
SELECT * FROM Production.Document d
WHERE CONTAINS
(DocumentSummary,'ISABOUT ( bicycle
weight (.9), seat weight (.1))')
KEY – jest to tak naprawdę wartość klu-
cza głównego wiersza, który określaliśmy
podczas tworzenia indeksu FTS. Dzięki tej
wartości mamy możliwość odwołania się
do konkretnego wiersza w tabeli;
RANK – wartość z zakresu 0..1000, która
wskazuje, jak trafnie dany wiersz odpowia-
da naszemu zapytaniu. Im większa wartość
RANK , tym wynik jest bardziej trafny.
Polecenie FREETEXT
Polecenie FREETEXT jest bardzo podobne do
polecenia CONTAINS . Jego składnia jest tak-
że praktycznie identyczna. Jedyną różnicą jest
metoda wyszukiwania. Polecenie FREETEXT, w
przeciwieństwie do CONTAINS, nie skupia się
na dokładnym wystąpieniu szukanych słów, ale
na ich znaczeniu. Porównajmy poniższe polece-
nia CONTAINS i FREETEXT – obydwa szukają
wystąpień słowa replace .
expansion – rozszerza zakres wyszukiwania
jednego słowa do jego synonimów;
replacement – umożliwia zamianę szukane-
go słowa innym.
Składnia polecenia CONTAINSTABLE jest na-
stępująca:
W pliku tsENG.xml znajdziemy następujący
fragment:
SELECT * FROM Production.Document WHERE
CONTAINS (DocumentSummary, 'replace')
SELECT * FROM Production.Document WHERE
FREETEXT (DocumentSummary, 'replace')
CONTAINSTABLE (<table>, {column|*},
‘<contains search condition>’ [, <top
‘n’>])
<expansion>
<sub>Internet Explorer</sub>
<sub>IE</sub>
<sub>IE5</sub>
</expansion>
Pierwsze zapytanie zwraca jeden wiersz z do-
kładnym wystąpieniem słowa replace. Drugie
zapytanie zwraca trzy wiersze, w których wy-
stępują różne formy słowa replace (polecenie
FREETEXT znajduje inne fleksyjne formy tego
słowa: replacing , replacement , replaced ). Oznacza
table – tabela, dla której będzie wykonywa-
ne szukanie;
column – lista kolumn, dla których będzie
wykonywane wyszukiwanie (dla wszyst-
kich kolumn objętych indeksem można
użyć symbolu *);
‘<contains search condition>’ – warunek szu-
kania identyczny jak w przypadku polece-
nia CONTAINS ;
top n – umożliwia ograniczenie liczby zwra-
canych rekordów.
Oznacza on, że w każde wyszukiwanie szuka-
nie słowa IE będzie rozszerzone do słów IE5 i
Listing 1. Tworzenie tabeli przechowującej dane o plikach PDF
CREATE TABLE [ dbo ].[ myPDF ](
[ id ] [ int ] IDENTITY ( 1 , 1 ) NOT NULL ,
[ FileName ] [ varchar ]( 100 ) COLLATE Polish_CI_AS NULL ,
[ FileExt ] [ nvarchar ]( 10 ) COLLATE Polish_CI_AS NULL ,
[ FileSrc ] [ varbinary ]( max ) NULL ,
CONSTRAINT [ PK_myPDF ] PRIMARY KEY CLUSTERED
(
[ id ] ASC
) WITH ( IGNORE_DUP_KEY = OFF ) ON [ PRIMARY ]
) ON [ PRIMARY ]
GO
Przetestujmy polecenie CONTAINSTABLE do
znanego nam już wyszukania fleksyjnych od-
mian słowa replace :
SELECT * FROM CONTAINSTABLE
(Production.Document,DocumentSummary, '
FORMSOF (INFLECTIONAL, replace) ')
Jako wynik otrzymujemy trzy wiersze. W pierw-
szej kolumnie jest odwołanie do klucza główne-
58
07/2009
441074752.035.png 441074752.036.png 441074752.037.png 441074752.038.png 441074752.039.png 441074752.040.png 441074752.041.png
 
Zgłoś jeśli naruszono regulamin