Zespół inżynierski obsługujący serwis do hostowania wideo zamienił indeks SQLite FTS5 na klaster OpenSearch, co pozwoliło zredukować liczbę zapytań bez wyników z 12% do 1,4% oraz zwiększyć współczynnik search-to-click o 9%, utrzymując jednocześnie opóźnienie poniżej 28 ms.
Dlaczego ta zmiana stała się pilna
Rozszerzenie SQLite do wyszukiwania pełnotekstowego (FTS5) jest atrakcyjne: znajduje się w tym samym pliku co reszta danych, nie generuje kosztów licencyjnych i natychmiast zwraca dopasowania dla dokładnych tokenów. Logi platformy wykazały jednak, że około dwunastu procent wyszukiwań użytkowników nie zwracało żadnych wyników. Główną przyczyną były literówki, takie jak „intersteller” czy „avengrs endgame” – błędy typowe dla korzystania z klawiatur mobilnych.
Szybkie rozwiązanie doraźne z wykorzystaniem trigramów (trójznakowych fragmentów) obniżyło odsetek pustych wyszukiwań do 7%, ale wprowadziło dwa problemy. Po pierwsze, rozmiar indeksu wzrósł ponad trzykrotnie, co zwiększyło koszty przechowywania i spowolniło aktualizacje. Po drugie, ucierpiała trafność wyników; dopasowanie rozmyte (fuzzy matching) zwracało chaotyczną mieszankę niepowiązanych filmów, co zamiast pomagać, wprowadzało użytkowników w błąd.
Zespół doszedł do wniosku, że niezbędny jest wyspecjalizowany silnik wyszukiwania, posiadający natywną odporność na literówki oraz zaawansowane mechanizmy oceniania trafności.
Budowa potoku OpenSearch
SQLite jako jedyne źródło prawdy (source of truth)
OpenSearch służył jako tymczasowa, przeznaczona tylko do odczytu replika. Wszystkie metadane wideo pozostały w SQLite; indeks wyszukiwania można było odbudować bez ryzyka utraty danych. W przypadku awarii klastra OpenSearch, aplikacja automatycznie przełączała się na oryginalny silnik FTS5.
Warstwowa trafność dzięki zapytaniom typu „should”
Zamiast polegać wyłącznie na dopasowaniu rozmytym, zapytanie łączyło trzy klauzule:
- Dokładne dopasowanie frazy – najwyższy boost, nagradzający użytkowników, którzy poprawnie wpisali tytuł.
- Wszystkie termy obecne – średni boost, wyłapujący zapytania, w których występują wszystkie słowa, ale niekoniecznie w odpowiedniej kolejności.
- Dopasowanie rozmyte (fuzzy match) – niski boost, działający jako siatka bezpieczeństwa dla błędnie wpisanych tokenów.
Ta hierarchia pozwoliła zachować precyzję dla poprawnych zapytań, oferując jednocześnie wyrozumiały mechanizm awaryjny dla literówek.
Dostrajanie ustawień rozmytych (fuzzy settings)
Długość prefiksu (prefix length) ustawiona na 1 wymuszała dopasowanie pierwszego znaku każdego termu, zanim uruchomiona zostanie logika rozmyta. Zasada ta zapewniła szybkość wyszukiwania i zapobiegła gwałtownemu wzrostowi liczby potencjalnych wyników, co mogłoby przeciążyć pamięć. Zespół ograniczył również maksymalną liczbę rozszerzeń termów, co stanowiło kolejny bezpiecznik chroniący przed niekontrolowanym zużyciem zasobów.
Strategia synchronizacji
Trzy uzupełniające się procesy dbają o to, aby indeks OpenSearch był zgodny z SQLite:
- Zadanie cron do synchronizacji nowych danych.
- Nocne sprawdzanie różnic (diff pass) – skanuje w poszukiwaniu niezgodności, które mogły umknąć podczas aktualizacji przyrostowych.
- Cotygodniowa pełna odbudowa – odbywa się przy użyciu aliasu indeksu, a następnie podmienia alias w jednej operacji, co gwarantuje brak przestojów.
Mierzalny wpływ po dwóch tygodniach
- Liczba zapytań bez wyników spadła z 12% do 1,4%.
- Konwersja search-to-click wzrosła o 9%.
- Mediana opóźnienia pozostała poniżej 28 ms, co mieści się w założonych celach dotyczących doświadczenia użytkownika (UX).
Uwagi i zastrzeżenia
Migracja nie jest ulepszeniem typu „plug-and-play”. Zespół podkreśla, że główną bazę danych nigdy nie należy zastępować silnikiem wyszukiwania; SQLite pozostaje nadrzędnym źródłem wszystkich metadanych wideo.
Podsumowanie
Wprowadzenie odporności na literówki za pomocą wyspecjalizowanego silnika wyszukiwania zmieniło wyraźny „ślepy zaułek” w ścieżce użytkownika w płynne i szybkie doświadczenie. Studium przypadku pokazuje, że zdyscyplinowana architektura – utrzymująca relacyjną bazę danych jako źródło prawdy, stosująca warstwowanie trafności i zabezpieczająca logikę rozmytą – może przynieść wymierne korzyści bez poświęcania stabilności.