Pełnotekstowe wyszukiwanie w SQLite i PHP5

SQLite w wersji 3.5.9 i nowszych obsługuje pełnotekstowe (tak jakby, nie jest zbyt zaawansowany) wyszukiwanie za pomocą modułów FTS1,2,3. W PHP 5.2 i nowszych można bez problemu korzystać z tego "modułu" by stworzyć wydajny system wyszukiwania dla tej bazy danych.

Oto przykładowy skrypt obrazujący implementację i możliwości wyszukiwania przez FTS3:

<h1>Pełnotekstowe wyszukiwanie test</h1>
<?php
try {
	$dbh = new PDO('sqlite:tmp/database.db');
	$dbh->query('CREATE VIRTUAL TABLE articles_search using FTS3(art_id, title, body);');
} catch (PDOException $e) {
	print "Error BRAK FTS3 :) !: " . $e->getMessage() . "<br/>";
	die();
}

// dodajemy kilka przykładowych rekordów
$dbh->query('INSERT INTO articles_search (art_id, title, body) VALUES (1, "Programowanie w PHP", "To jest treść programowanie w PHP")');
$dbh->query('INSERT INTO articles_search (art_id, title, body) VALUES (2, "Programowanie w Erlangu", "To jest treść programowanie w Erlangu")');
$dbh->query('INSERT INTO articles_search (art_id, title, body) VALUES (3, "Coś innego w PHP", "Bardzo ciekawy art w PHPie")');

// wyszukiwanie
print '<h2>Wyszukiwanie "PHP"</h2>';
foreach($dbh->query('SELECT art_id, title FROM articles_search WHERE body MATCH "PHP"') as $row) {
	print_r($row);
	}

print '<h2>Wyszukiwanie "programowanie"</h2>';
foreach($dbh->query('SELECT art_id, title FROM articles_search WHERE body MATCH "programowanie"') as $row) {
	print_r($row);
	}
Jeżeli mamy zbyt stare PHP (i tym samym zbyt starą bibliotekę SQLite) to tworzenie wirtualnej tabeli z FTS3 nie powiedzie się (można próbować jeszcze użyć FTS2 czy FTS1 w identyczny sposób).

Podstawa to stworzenie (jednorazowe) tabeli wirtualnej obsługujące wyszukiwanie:

CREATE VIRTUAL TABLE nazwa_tabeli using FTS3(pole, pole, pole)
Wszystkie pola są typu tekstowego. Zazwyczaj będziemy chcieli przetrzymywać w nich kopię tekstu np. artykułów, oraz dane umożliwiające łatwe wyświetlenie wyników (ID oryginalnego wpisu i np. tytuł). Mając zwykłą tabelę na artykuły musimy dodać dodawanie odpowiednio spreparowanej kopii artykułu także do tabeli wirtualnej (można usunąć znaczniki z tekstu żeby zaoszczędzić na rozmiarze bazy).

Drugi element to wyszukiwanie, które realizujemy za pomocą zapytania SQL:

SELECT co FROM nazwa_tabeli WHERE kolumna MATCH "fraza"

Inne rozwiązania

FTS3 to dość prosty mechanizm wyszukiwania. Jeżeli potrzebujemy czegoś bardziej zaawansowanego, w pełni pełnotekstowego (rozróżniającego odmianę wyrazów - stemming) to musimy sięgnąć po rozwiązania z górnej półki jak Solr czy Xapian (użycie czego wymaga raczej własnego serwera, lub odpowiedniej konfiguracji usług w przypadku lepszego hostingu współdzielonego). Dla bazy MySQL możemy użyć Sphinxa (popularnie używany na serwisach średniego i większego kalibru, także wymaga własnego serwera generalnie), lub na mniejsze obciążenia systemu pełnotekstowego MySQL dla tabel MyISAM. Dla PostgreSQL dostępne jest kilka rozwiązań jak OpenFTS.

A jeżeli mamy dobrze zindeksowany w Google serwis, to można wykorzystać wklejkę Google Ajax Search ograniczając wyniki dla własnej strony :)

RkBlog

Podstawy PHP, 7 September 2009

Comment article
Comment article RkBlog main page Search RSS Contact