Wyszukiwanie Sphinx PrestaShop: szybsze przeszukiwanie katalogu w dużych sklepach

Natywne wyszukiwanie w katalogu sprawdza się w małych sklepach. W dużych katalogach może spowalniać przy każdym naciśnięciu klawisza i przy każdej przebudowie indeksu. Wyszukiwanie sphinx prestashop przenosi dopasowywanie pełnotekstowe do dedykowanego silnika, dzięki czemu wyszukiwanie produktów pozostaje szybkie, a PrestaShop nadal renderuje karty produktów.

Sphinx to serwer wyszukiwania pełnotekstowego. Indeksuje się pola produktów z MySQL, uruchamia demon wyszukiwania, a następnie nadpisuje Search::find w PrestaShop, aby zapytania ze sklepu trafiały do tego silnika zamiast wbudowanego indeksu. W praktyce liczą się dwie linie technologiczne: Sphinx (nadal rozwijany; aktualne buildy Sphinx 3 różnią się od klasycznych pakietów open-source 2.x) i Manticore Search (open-source’owy fork Sphinx 2.x). Poniższe ścieżki instalacji i przykłady konfiguracji odnoszą się do klasycznych pakietów w stylu Sphinx 2, takich jak sphinxsearch na Debianie/Ubuntu. W Manticore lub Sphinx 3 należy liczyć się z innymi nazwami pakietów, katalogami konfiguracyjnymi i portami nasłuchu – idea pozostaje ta sama (indeksowanie ID produktów, zapytania z PHP).

Zanim zdecyduje się na demona i override, warto najpierw wypróbować natywne narzędzia – aliasy, dopasowanie rozmyte i wagi często rozwiązują problem „słabych wyników” bez nowej infrastruktury. Opis krok po kroku znajduje się w przewodniku po konfiguracji wyszukiwania PrestaShop. Oficjalne etykiety opcji dla aktualnych sklepów są w dokumentacji parametrów wyszukiwania PrestaShop 9.

Kiedy warto wdrożyć wyszukiwanie sphinx prestashop

Sphinx opłaca się, gdy:

  • Wyszukiwanie produktów lub przebudowa indeksu spowalniają przy realnym ruchu.
  • Potrzebna jest morfologia / stemming poza tym, co daje Shop Parameters → Search.
  • Nie stanowi problemu uruchomienie małej usługi na tym samym hoście (lub pobliskim) i utrzymanie crona indeksującego.

Można pominąć tę ścieżkę, gdy katalog jest niewielki, a problem dotyczy wyłącznie trafności – najpierw warto poprawić indeksowanie, aliasy i wagi. Przed nadpisaniem klasy zaleca się też pełną kopię zapasową PrestaShop; błędny Search.php może wyświetlić pustą stronę wyszukiwania w sklepie.

Instalacja Sphinx na serwerze

Nazwy pakietów różnią się w zależności od dystrybucji. Na Debianie/Ubuntu, jeśli dostępny jest klasyczny pakiet:

sudo apt-get update
sudo apt-get install sphinxsearch

Ten pakiet nadal występuje w kilku wydaniach Debiana, ale to starsza linia Sphinx 2 – nie Sphinx 3. Jeśli sphinxsearch nie ma w repozytoriach lub potrzebna jest utrzymywana wersja open-source, lepiej zainstalować Manticore według aktualnych instrukcji dla Debiana/Ubuntu. Unika się przypinania starych nazw plików .deb skopiowanych z nieaktualnych tutoriali (np. pakiety Sphinx 2.2 z czasów Wheezy) – warto pobrać to, co dokumentuje dziś dystrybucja lub dostawca.

Poniższe ścieżki zakładają klasyczny układ w /etc/sphinxsearch/. Manticore często używa /etc/manticoresearch/. Przed skierowaniem wyszukiwania sphinx prestashop na demona należy sprawdzić port SQL z dokumentacji instalacji (klasyczny Sphinx często używał 9306; inne buildy mogą się różnić).

Konfiguracja źródła i indeksu Sphinx

Edytuje się plik konfiguracyjny (często /etc/sphinxsearch/sphinx.conf):

sudo nano /etc/sphinxsearch/sphinx.conf

Definiuje się źródło MySQL pobierające pola do przeszukiwania. Należy podmienić dane logowania i prefiks tabel na wartości ze sklepu (ps_ to domyślny prefiks PrestaShop):

source PrestaSite
{
    type = mysql
    sql_host = localhost
    sql_user = DBUSER
    sql_pass = DBPASSWORD
    sql_db = DBNAME
    sql_port = 3306
    sql_query_pre = SET NAMES utf8mb4

    sql_query = 
        SELECT id_product, name, description, description_short 
        FROM ps_product_lang
}

index PrestaSite
{
    source = PrestaSite
    path = /var/lib/sphinxsearch/data/prestasite
    morphology = stem_en
    min_word_len = 1
}

Pierwsza kolumna sql_query staje się ID dokumentu zwracanym przez Sphinx – tutaj jest to id_product. Zapytanie jest celowo uproszczone. Sklepy wielojęzyczne lub multistore zwykle filtrują po id_lang / sklepie albo budują osobny indeks na język. Bloki indexera i demona wyszukiwania można zostawić przy rozsądnych domyślnych wartościach, o ile nie są potrzebne niestandardowe porty lub ścieżki logów. W Sphinx 3 lub Manticore składnia konfiguracji może wyglądać inaczej; mapuje się te same elementy (dane DB, SELECT pól produktu, ścieżka indeksu).

Budowa indeksu i uruchomienie demona wyszukiwania

Indeks buduje się raz, potem uruchamia demona. Klasyczny Sphinx używa indexer / searchd; niektóre pakiety opakowują te kroki w systemctl:

sudo indexer --all
sudo searchd

Odświeżanie według harmonogramu sprawia, że nowe i edytowane produkty pojawiają się w wynikach. Godzinowy cron to częsty punkt wyjścia. W /etc/crontab (crontab systemowy z kolumną użytkownika):

15 * * * * root indexer --all

Przy crontabie użytkownika (crontab -e) pomija się kolumnę root i wywołuje pełną ścieżkę do indexer. Warto potwierdzić, że demon nasłuchuje na porcie z konfiguracji – bez tego wyszukiwanie sphinx prestashop nie zwróci ID produktów. Jeśli start się nie udaje, sprawdza się uprawnienia do path indeksu i czy inna usługa nie zajmuje już tego portu. Wyszukiwanie sphinx prestashop działa dopiero wtedy, gdy nasłuch odpowiada na zapytania MATCH.

Podłączenie wyszukiwania sphinx prestashop przez override Search

PrestaShop nadal odpowiada za ładowanie produktów, stany magazynowe, obrazy i szablony. Sphinx zwraca tylko pasujące ID produktów. Nadpisuje się Search::find, aby te ID pochodziły z Sphinx, a następnie wykonuje się zwykłe zapytanie SQL o produkty dla bieżącego języka i sklepu.

W aktualnych wydaniach PrestaShop (1.7 do 9) Search::find nadal przyjmuje podobną listę argumentów, ale treść metody, obsługa wyszukiwania rozmytego i SQL produktów zmieniły się znacząco od wersji 1.6. Nie wkleja się starego pliku override na nowoczesny sklep. Otwiera się classes/Search.php sklepu, kopiuje find do /override/classes/Search.php, a następnie zamienia tylko fragment rozwiązujący pasujące ID produktów na zapytanie Sphinx/Manticore – reszta logiki core pozostaje. Poniższy PHP to uproszczona ilustracja tej zamiany ID (SphinxSQL na porcie 9306, indeks PrestaSite), a nie gotowy override do wklejenia w PrestaShop 9.

<?php
// Illustration only - adapt against your shop's classes/Search.php

protected static function getSphinxResults($search_query, $offset, $page_size)
{
    $results = array();
    $total = 0;

    if (!$search_query) {
        return null;
    }

    // Port and index name must match your Sphinx/Manticore config
    $link = @mysqli_connect('127.0.0.1', '', '', '', 9306);
    if (!$link) {
        return array('results' => $results, 'total' => $total);
    }

    $query = 'SELECT id FROM `PrestaSite` WHERE MATCH(''.pSQL($search_query).'') LIMIT '.(int)$offset.', '.(int)$page_size;
    if ($result = $link->query($query)) {
        while ($row = $result->fetch_assoc()) {
            if (isset($row['id'])) {
                $results[] = (int) $row['id'];
            }
        }
        $result->close();
    }

    $query_total = 'SELECT count(*) AS c FROM `PrestaSite` WHERE MATCH(''.pSQL($search_query).'')';
    if ($result = $link->query($query_total)) {
        $total = (int) $result->fetch_assoc()['c'];
        if ($total > 1000) {
            $total = 1000;
        }
        $result->close();
    }

    mysqli_close($link);

    return array('results' => $results, 'total' => $total);
}

W override find wywołuje się ten helper, a następnie ogranicza zapytanie produktowe core warunkiem WHERE p.id_product IN (...) z użyciem zwróconych ID (rzutowanych na liczby całkowite). To cały hak wyszukiwania sphinx prestashop: ID z demona, reszta z PrestaShop. W produkcji warto zadbać o bezpieczne escapowanie, preferować prepared statements tam, gdzie klient na to pozwala, i wracać do natywnego wyszukiwania, gdy demon nie działa. Po zapisaniu override czyści się cache, aby PrestaShop przeładował klasę.

Czyszczenie cache i weryfikacja wyszukiwania w sklepie

  • Cache czyści się w Advanced Parameters → Performance (oraz usuwa legacy /cache/class_index.php, jeśli instalacja nadal używa tej ścieżki).
  • Warto potwierdzić, że plik override jest czytelny i ma dokładnie nazwę Search.php w /override/classes/.
  • W oknie prywatnym wyszukuje się znaną nazwę produktu.
  • Jeśli po override pojawia się pusta strona, traktuje się to jak każdy fatalny błąd PHP – patrz checklista białego ekranu śmierci, a w razie potrzeby przywraca kopię zapasową.

Wyszukiwanie sphinx prestashop to infrastruktura, a nie przełącznik w Back Office. Wyszukiwanie sphinx prestashop wymaga, by cron indeksujący działał regularnie, dysk przy ścieżce indeksu wymaga monitoringu, a natywne ustawienia wyszukiwania warto przeglądać ponownie, gdy problemem jest trafność – a nie szybkość.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *