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);
}
Podstawa to stworzenie (jednorazowe) tabeli wirtualnej obsługujące wyszukiwanie:
Drugi element to wyszukiwanie, które realizujemy za pomocą zapytania SQL:
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 :)
Comment article