Autocompleter – wydajne i elastyczne automatyczne uzupełnianie treści

Obecnie prawie każda strona WWW posiada wyszukiwarkę. Nieodłącznym elementem wyszukiwarki jest funkcja podpowiadania (lub przewidywania) tekstu wpisywanego przez użytkownika.

Wiele stron jest wykonanych przy użyciu PHP oraz MySQL. Wykonanie mechanizmu podpowiadania treści w języku PHP jest proste, ale ma pewne wady. Przede wszystkim, zapytanie użytkownika trafia najpierw do parsera PHP, a dopiero potem do bazy danych (czyli do miejsca, w którym następuje faktyczne przetwarzanie danych). Po drugie, operacje wyszukiwania odbywają się w MySQL (zwykle przy pomocy operatora LIKE), co niekoniecznie pozytywnie przekłada się na wydajność.

Możemy zastosować wyszukiwarki takie jak Sphinx czy Solr, ale pierwsza z nich nadal wymaga PHP (lub innego języka), ponieważ nie możemy się do niej podłączyć z poziomu JavaScriptu, a druga jest ogromną aplikacją (nie potrzebujemy, aż tylu funkcji) oraz wymaga Javy co dla niektórych administratorów samo w sobie jest przeszkodą (z powodów znanych tylko im ;)).

Zawsze interesowały mnie zagadnienia związane z wyszukiwaniem i przetwarzaniem informacji, więc postanowiłem wykonać aplikację, która rozwiąże powyższe problemy. Aplikacja działa jako serwer HTTP, obsługuje obecnie dwa rodzaje źródeł danych (JSON, MySQL), zwraca dane w formacie JSONP. Treści są indeksowane przy pomocy algorytmu Radix Tree. Istnieje możliwość implementacji własnych źródeł danych oraz indeksów.

Lista funkcji:

  • definiowanie wielu źródeł danych (każde źródło danych może zostać dołączone do dowolnego indeksu),
  • obsługa plików w formacie JSON,
  • obsługa bazy MySQL,
  • definiowanie wielu indeksów (każdy indeks może korzystać z dowolnej liczby źródeł danych),
  • obsługa filtrów tekstowych (każdą frazę można filtrować przed dodaniem jej do indeksu oraz przed uruchomieniem wyszukiwania),
  • całe API oraz obsługa dostępne przez HTTP,
  • podgląd stan usługi przez HTTP,
  • podgląd statystyk usługi oraz wyszukiwania przez HTTP.

Lista dostępnych filtrów:

  • zamiana na wielkie znaki (uppercase filter),
  • zamiana na małe znaki (lowercase filter),
  • usuwanie znaków lub fraz (ignore filter),
  • zamiana znaków lub fraz (replace filter),
  • obcinanie znaków z początku lub końca frazy (trim filter),
  • usuwanie fraz zbyt krótkich lub zbyt długich (length filter).

Lista planowanych funkcji:

  • implementacja cache’a służącego do przechowywania wyników wyszukiwania,
  • implementacja lokalnego magazynu danych służącego do przechowywania zawartości indeksów tak, aby ponowne uruchomienie aplikacji nie wymagało ponownego pobierania danych ze źródeł danych.

Obecna wersja nie jest stabilna, ale działa :) Program można uruchomić pod systemem Windows (jest dostępny projekt dla MS Visual C++ 2010 Epress) oraz pod Linuksem (obecnie brak Makefile, ale pojawi się w niedługim czasie).

Kod źródłowy aplikacji jest dostępny w serwisie GitHub. Źródła zostały udostępnione na licencji GNU.

Ten wpis został opublikowany w kategorii C++, Linux, Windows. Dodaj zakładkę do bezpośredniego odnośnika.