Wyszukiwanie pełnotekstowe nie jest trywialne, nie istnieje jego jedyne dobre rozwiązanie.
Widziałem już różne rozwiązania:
-
LIKE %%,
-
FULL TEXT w MyISAM,
-
Lucene,
-
Sphinx Search.
Często stosowane są strategie kolejnego przechodzenie przez powyższe.
-
Mamy 100 – 200 artykulów? Nie jest problemem uzycie standardu SQL i składni LIKE – nie wymaga to od nas żadnej pracy.
-
Jeśli to przestaje wystarczać, możemy dodac indeks FULL TEXT (o ile korzystamy z tabel MyISAM w mySQL) – wystarczy drobna modyfikacja kwerend (zamiast LIKE, MATCH AGAINST …). FULL TEXT działa bardzo szybko, niepozbawiony jest jednak wad. Przy tabelach obciążonych dużą ilością modyfikacji danych całe rozwiązanie zaczyna niebezpiecznie zwalniać (indeks przy każdej zmianie musi być przebudowywany)…
-
Lucene i Sphinx (jest szybszy) to wyjścia zdecydowanie lepsze – które nie tracą na szybkosći wraz ze wzrostem ilości przetwarzanych danych i nie są zależne od charakteru operacji.
Niestety w tym momencie przestajemy korzystać z bazy danych a zwracamy się do dedykowanego indeksu wyszukiwania. Co za tym idzie musimy dosyć istotnie zmodyfikować modele pobierania danych.
Czy nie byloby pięknie napisać zapytania raz a wymieniać tylko mechanizmy które je przetwarzają.
Taki scenariusz jest możliwy przy wykorzystaniu naszego gangliba.
Proste zapytanie: $qr->select(‘*’)->from(‘articles’)->like(‘content’,’%napis%’);
-
Początkowo może być wykonywane bezpośrednio na bazie danych korzystając ze strategii opartych na PDO.
-
Jeśli napotkamy problem, możemy zmodyfikować strategię lub dialekt sql (budujący zapytania) aby zamiast LIKE wstawiał do zapytań MATCH AGAINST … Dokonujemy zmiany tylko w jednym miejscu, zmieniając kod kilku linijek kodu.
-
Jeśli chcemy przenieść się na dedykowany indeks wyszukiwawczy – wystarczy, że utworzymy nową strategię (Div_Db_Distributor_Strategy_Sphinx?
) i poprosimy dystrybutor danych aby z niej korzystał. W kodzie strategii definiujemy w jaki sposób ma być obsługiwana klauzula LIKE – tj. tłumaczona na odpowiednei wywołanie API sphinxa.
To wszystko
ps. Korzystając ze sphinxa możemy emulować wykrozystanie wielu klauzul SQL nie tylko LIKE – np. ORDER BY, GROUP BY, WHERE (po wartościach liczbowych) – daje to naprawdę duże możliwości. Możemy przecież połączyć w jednej strategii sphinxa + pobieranie danych o zwróconych przezeń dokumentach z bazy danych i/lub cache.