Delphi - Full-Text Catalog létrehozása, használata

Transact SQL 24. rész

forráskód letöltése
Egy tábla szöveges mezőjében hagyományos módon többféleképpen is kereshetünk, akár tényleges adatra, akár csak egy részletre. Az MS SQL azonban tud egy olyan keresési módszert is, aminek segítségével a szöveges adatok keresésére szinte minden elképzelhető módszert felhasználhatunk. Ez a lehetőség a Full-Text Catalog használatával válik elérhetővé. A cikksorozatnak ebben a részében erről lesz szó.
A program indítása előtt a Northwind adatbázisban lévő Employees táblában létrehozunk egy Full Text Catalog-ot. Ehhez indítsuk el az Enterprise Manager-t, nyissuk meg a Northwind adatbázist, majd ezen belül kattintsunk a jobb gombbal a Full-Text Catalogs elemen. A megjelenő menüből válasszuk a New Full-Text Catalog menüpontot. Adjuk meg a katalógus nevét és elérési útvonalát (ez utóbbit hagyhatjuk az alapértelmezett értéken). A katalógus nevének bármit megadhatunk, lehet például „Catalog1”. Ha sikerült létrehoznunk a katalógust, akkor a Tables listában kattintsunk a jobb gombbal az Employees táblán, és válasszuk ki a Full-Text Index Table menü Define Full-text Indexing on a Table menüpontját.
Megjelenik egy Varázsló, itt kattintsunk a Tovább gombra, majd megint Tovább. A listában jelöljük ki azokat a mezőket, amelyeket fel akarunk venni a Full-Text katalógusba. Jelöljük ki a Notes mező előtti jelölőnégyzetet (megadhatnánk több, karakteres adatot tartalmazó mezőt is, de ezeket a példában nem használjuk). Ezután kattintsunk a Tovább gombra, majd megint Tovább, és Befejezés. Ezután a Full-Text catalogs listában kattintsunk a „Catalog1” (vagy a megadott nevű) elemre a jobb gombbal, és válasszuk a Start Full Population menüpontot. Ha a művelet befejeződött, a Full-Text Catalog készen áll a használatra.
A Full-Text Catalog nagy előnye, hogy akár memo mezőben is kereshetünk szavakat vagy kifejezéseket, ráadásul erre többféle lehetőségünk van:
  • egyszerű keresés szóra vagy kifejezésre;
  • szó- vagy kifejezés részletre keresés;
  • olyan szavak vagy kifejezések keresése, amelyek egy másik szó vagy kifejezés közelében állnak;
  • keresés szótőképzéssel (egy szó ragozott és normál változatát is megtalálja);
  • a keresésnél a keresett szavak és kifejezések prioritásának megadása;
Az első két lehetőség ezek közül nem kifejezetten új lehetőség, ezeket meg lehet oldani a Full-Text Catalog használata nélkül is. Az utolsó három lehetőség viszont nagyon jól használható összetettebb kereséseknél, akár nagyobb szövegekben is.
A kereséshez a CONTAINS függvényt használhatjuk fel. Ennek első paramétere annak a mezőnek a neve, amiben keresünk. Természetesen csak olyan mező nevét adhatjuk meg, amelyik szerepel a Full-Text Index-ben. Ha minden mezőben keresünk, akkor a mező neve helyett a * karaktert kell használnunk.
SELECT * FROM Employees WHERE CONTAINS(Notes, ’German’);
A függvény formátuma tehát a következő:
CONTAINS(<column>, <contains_search_condition>)
A <contains_search_condition> a keresési feltétel. Ez lehet egy egyszerű szó, vagy kifejezés, de ha összetettebb lekérdezést akarunk létrehozni, akkor azt is megadhatjuk itt. Néhány példában nézzük meg, hogy milyen lehetőségeink vannak:
Az első példa egyértelmű, egyszerű szóra keresünk.
SELECT * FROM Employees WHERE CONTAINS(Notes, 'International');
A második példában már egy összetettebb feltételt adtunk meg, aminek hatása az lesz, hogy az eredményben csak azok a rekordok fognak szerepelni, amelyekben szerepel a „French” szó, és a „University” vagy a „College” szó.
SELECT * FROM Employees WHERE CONTAINS(Notes, ’(”University” OR „College”) AND „French”’);
A harmadik példában azokat a rekordokat kérdezzük le, amelyeknek Notes mezőjében olyan szavak találhatók, amelyek az „inter” karakterekkel kezdődnek (pl. „International”). A keresett szavakat egy Memo szövegben is megtalálja.
SELECT * FROM Employees WHERE CONTAINS(Notes, ’”inter*”’);
A negyedik példa azokat a rekordokat kérdezi le, amelyeknek Notes mezőjében a „French” és a „German” szó egymáshoz közel állnak. A NEAR kulcsszó helyett használhatjuk a ~ karaktert is.
SELECT * FROM Employees WHERE CONTAINS(Notes, ’French NEAR German’);
A negyedik példa a szótőképzéssel történő keresést mutatja be. Ennek módja az alábbi példából jól látszik. A példában azokat a rekordokat kérdezzük le, amelyeknek Notes mezőjében szerepel a „complete” szó valamelyik alakja (pl. „completing”, „completed”, stb.).
SELECT * FROM Employees WHERE CONTAINS(Notes, ’FORMSOF(INFLECTIONAL, Complete)’);
Az utolsó példában rangsoroljuk a keresett szavakat. Az ISABOUT kulcsszó után zárójelben adhatjuk meg a keresett szavakat. A szavak után a weight kulcsszó áll, utána pedig zárójelben egy 0 és 1 közötti szám. A szám a szó vagy kifejezés „súlyát” határozza meg. A nagyobb érték a fontosabb, a kisebb érték pedig a kevésbé fontos szavakhoz tartozik. Ennek hasznát igazán a CONTAINSTABLE függvénynél fogjuk látni, amelynek szintaxisa szinte teljesen megegyezik a CONTAINS függvényével. Erről a cikksorozat következő részében lesz szó.
SELECT * FROM Employees WHERE CONTAINS(Notes, ’ISABOUT('ISABOUT(University weight(0.8), French weight (0.4), College weight (0.1))');

Transact SQL cikksorozat