{"id":1061,"date":"2021-10-22T15:18:50","date_gmt":"2021-10-22T12:18:50","guid":{"rendered":"https:\/\/presta.site\/blog\/korzystanie-z-wyszukiwarki-sphinx-w-prestashop\/"},"modified":"2026-07-24T15:01:00","modified_gmt":"2026-07-24T12:01:00","slug":"korzystanie-z-wyszukiwarki-sphinx-w-prestashop","status":"publish","type":"post","link":"https:\/\/presta.site\/blog\/pl\/korzystanie-z-wyszukiwarki-sphinx-w-prestashop\/","title":{"rendered":"Wyszukiwanie Sphinx PrestaShop: szybsze przeszukiwanie katalogu w du\u017cych sklepach"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Natywne wyszukiwanie w katalogu sprawdza si\u0119 w ma\u0142ych sklepach. W du\u017cych katalogach mo\u017ce spowalnia\u0107 przy ka\u017cdym naci\u015bni\u0119ciu klawisza i przy ka\u017cdej przebudowie indeksu. <strong>Wyszukiwanie sphinx prestashop<\/strong> przenosi dopasowywanie pe\u0142notekstowe do dedykowanego silnika, dzi\u0119ki czemu wyszukiwanie produkt\u00f3w pozostaje szybkie, a PrestaShop nadal renderuje karty produkt\u00f3w.<\/p>\n\n\n<!--more-->\n\n\n<p class=\"wp-block-paragraph\">Sphinx to serwer wyszukiwania pe\u0142notekstowego. Indeksuje si\u0119 pola produkt\u00f3w z MySQL, uruchamia demon wyszukiwania, a nast\u0119pnie nadpisuje <code class=\"codecolorer text default\"><span class=\"text\">Search::find<\/span><\/code> w PrestaShop, aby zapytania ze sklepu trafia\u0142y do tego silnika zamiast wbudowanego indeksu. W praktyce licz\u0105 si\u0119 dwie linie technologiczne: <a href=\"https:\/\/sphinxsearch.com\/\" target=\"_blank\" rel=\"noopener noreferrer external\" data-wpel-link=\"external\">Sphinx<\/a> (nadal rozwijany; aktualne buildy Sphinx 3 r\u00f3\u017cni\u0105 si\u0119 od klasycznych pakiet\u00f3w open-source 2.x) i <a href=\"https:\/\/manticoresearch.com\/\" target=\"_blank\" rel=\"noopener noreferrer external\" data-wpel-link=\"external\">Manticore Search<\/a> (open-source&#8217;owy fork Sphinx 2.x). Poni\u017csze \u015bcie\u017cki instalacji i przyk\u0142ady konfiguracji odnosz\u0105 si\u0119 do klasycznych pakiet\u00f3w w stylu Sphinx 2, takich jak <code class=\"codecolorer text default\"><span class=\"text\">sphinxsearch<\/span><\/code> na Debianie\/Ubuntu. W Manticore lub Sphinx 3 nale\u017cy liczy\u0107 si\u0119 z innymi nazwami pakiet\u00f3w, katalogami konfiguracyjnymi i portami nas\u0142uchu &#8211; idea pozostaje ta sama (indeksowanie ID produkt\u00f3w, zapytania z PHP).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zanim zdecyduje si\u0119 na demona i override, warto najpierw wypr\u00f3bowa\u0107 natywne narz\u0119dzia &#8211; aliasy, dopasowanie rozmyte i wagi cz\u0119sto rozwi\u0105zuj\u0105 problem \u201es\u0142abych wynik\u00f3w\u201d bez nowej infrastruktury. Opis krok po kroku znajduje si\u0119 w <a href=\"https:\/\/presta.site\/blog\/pl\/krotki-przewodnik-po-konfiguracji-wyszukiwarki-prestashop\/\" data-wpel-link=\"internal\">przewodniku po konfiguracji wyszukiwania PrestaShop<\/a>. Oficjalne etykiety opcji dla aktualnych sklep\u00f3w s\u0105 w <a href=\"https:\/\/docs.prestashop-project.org\/v.9-documentation\/user-guide\/configuring-shop\/shop-parameters\/search\/search-parameters\" target=\"_blank\" rel=\"noopener noreferrer external\" data-wpel-link=\"external\">dokumentacji parametr\u00f3w wyszukiwania PrestaShop 9<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Kiedy warto wdro\u017cy\u0107 wyszukiwanie sphinx prestashop<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Sphinx op\u0142aca si\u0119, gdy:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Wyszukiwanie produkt\u00f3w lub przebudowa indeksu spowalniaj\u0105 przy realnym ruchu.<\/li>\n<li>Potrzebna jest morfologia \/ stemming poza tym, co daje Shop Parameters \u2192 Search.<\/li>\n<li>Nie stanowi problemu uruchomienie ma\u0142ej us\u0142ugi na tym samym ho\u015bcie (lub pobliskim) i utrzymanie crona indeksuj\u0105cego.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Mo\u017cna pomin\u0105\u0107 t\u0119 \u015bcie\u017ck\u0119, gdy katalog jest niewielki, a problem dotyczy wy\u0142\u0105cznie trafno\u015bci &#8211; najpierw warto poprawi\u0107 indeksowanie, aliasy i wagi. Przed nadpisaniem klasy zaleca si\u0119 te\u017c <a href=\"https:\/\/presta.site\/blog\/pl\/jak-utworzyc-kopie-zapasowa-w-prestashop\/\" data-wpel-link=\"internal\">pe\u0142n\u0105 kopi\u0119 zapasow\u0105 PrestaShop<\/a>; b\u0142\u0119dny <code class=\"codecolorer text default\"><span class=\"text\">Search.php<\/span><\/code> mo\u017ce wy\u015bwietli\u0107 pust\u0105 stron\u0119 wyszukiwania w sklepie.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Instalacja Sphinx na serwerze<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nazwy pakiet\u00f3w r\u00f3\u017cni\u0105 si\u0119 w zale\u017cno\u015bci od dystrybucji. Na Debianie\/Ubuntu, je\u015bli dost\u0119pny jest klasyczny pakiet:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt-get update\nsudo apt-get install sphinxsearch<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ten pakiet nadal wyst\u0119puje w kilku wydaniach Debiana, ale to starsza linia Sphinx 2 &#8211; nie Sphinx 3. Je\u015bli <code class=\"codecolorer text default\"><span class=\"text\">sphinxsearch<\/span><\/code> nie ma w repozytoriach lub potrzebna jest utrzymywana wersja open-source, lepiej zainstalowa\u0107 <a href=\"https:\/\/manticoresearch.com\/\" target=\"_blank\" rel=\"noopener noreferrer external\" data-wpel-link=\"external\">Manticore<\/a> wed\u0142ug aktualnych instrukcji dla Debiana\/Ubuntu. Unika si\u0119 przypinania starych nazw plik\u00f3w <code class=\"codecolorer text default\"><span class=\"text\">.deb<\/span><\/code> skopiowanych z nieaktualnych tutoriali (np. pakiety Sphinx 2.2 z czas\u00f3w Wheezy) &#8211; warto pobra\u0107 to, co dokumentuje dzi\u015b dystrybucja lub dostawca.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Poni\u017csze \u015bcie\u017cki zak\u0142adaj\u0105 klasyczny uk\u0142ad w <code class=\"codecolorer text default\"><span class=\"text\">\/etc\/sphinxsearch\/<\/span><\/code>. Manticore cz\u0119sto u\u017cywa <code class=\"codecolorer text default\"><span class=\"text\">\/etc\/manticoresearch\/<\/span><\/code>. Przed skierowaniem wyszukiwania sphinx prestashop na demona nale\u017cy sprawdzi\u0107 port SQL z dokumentacji instalacji (klasyczny Sphinx cz\u0119sto u\u017cywa\u0142 <code class=\"codecolorer text default\"><span class=\"text\">9306<\/span><\/code>; inne buildy mog\u0105 si\u0119 r\u00f3\u017cni\u0107).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Konfiguracja \u017ar\u00f3d\u0142a i indeksu Sphinx<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Edytuje si\u0119 plik konfiguracyjny (cz\u0119sto <code class=\"codecolorer text default\"><span class=\"text\">\/etc\/sphinxsearch\/sphinx.conf<\/span><\/code>):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nano \/etc\/sphinxsearch\/sphinx.conf<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Definiuje si\u0119 \u017ar\u00f3d\u0142o MySQL pobieraj\u0105ce pola do przeszukiwania. Nale\u017cy podmieni\u0107 dane logowania i prefiks tabel na warto\u015bci ze sklepu (<code class=\"codecolorer text default\"><span class=\"text\">ps_<\/span><\/code> to domy\u015blny prefiks PrestaShop):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>source PrestaSite\n{\n    type = mysql\n    sql_host = localhost\n    sql_user = DBUSER\n    sql_pass = DBPASSWORD\n    sql_db = DBNAME\n    sql_port = 3306\n    sql_query_pre = SET NAMES utf8mb4\n\n    sql_query = \n        SELECT id_product, name, description, description_short \n        FROM ps_product_lang\n}\n\nindex PrestaSite\n{\n    source = PrestaSite\n    path = \/var\/lib\/sphinxsearch\/data\/prestasite\n    morphology = stem_en\n    min_word_len = 1\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Pierwsza kolumna <code class=\"codecolorer text default\"><span class=\"text\">sql_query<\/span><\/code> staje si\u0119 ID dokumentu zwracanym przez Sphinx &#8211; tutaj jest to <code class=\"codecolorer text default\"><span class=\"text\">id_product<\/span><\/code>. Zapytanie jest celowo uproszczone. Sklepy wieloj\u0119zyczne lub multistore zwykle filtruj\u0105 po <code class=\"codecolorer text default\"><span class=\"text\">id_lang<\/span><\/code> \/ sklepie albo buduj\u0105 osobny indeks na j\u0119zyk. Bloki indexera i demona wyszukiwania mo\u017cna zostawi\u0107 przy rozs\u0105dnych domy\u015blnych warto\u015bciach, o ile nie s\u0105 potrzebne niestandardowe porty lub \u015bcie\u017cki log\u00f3w. W Sphinx 3 lub Manticore sk\u0142adnia konfiguracji mo\u017ce wygl\u0105da\u0107 inaczej; mapuje si\u0119 te same elementy (dane DB, SELECT p\u00f3l produktu, \u015bcie\u017cka indeksu).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Budowa indeksu i uruchomienie demona wyszukiwania<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Indeks buduje si\u0119 raz, potem uruchamia demona. Klasyczny Sphinx u\u017cywa <code class=\"codecolorer text default\"><span class=\"text\">indexer<\/span><\/code> \/ <code class=\"codecolorer text default\"><span class=\"text\">searchd<\/span><\/code>; niekt\u00f3re pakiety opakowuj\u0105 te kroki w <code class=\"codecolorer text default\"><span class=\"text\">systemctl<\/span><\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo indexer --all\nsudo searchd<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Od\u015bwie\u017canie wed\u0142ug harmonogramu sprawia, \u017ce nowe i edytowane produkty pojawiaj\u0105 si\u0119 w wynikach. Godzinowy cron to cz\u0119sty punkt wyj\u015bcia. W <code class=\"codecolorer text default\"><span class=\"text\">\/etc\/crontab<\/span><\/code> (crontab systemowy z kolumn\u0105 u\u017cytkownika):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>15 * * * * root indexer --all<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Przy crontabie u\u017cytkownika (<code class=\"codecolorer text default\"><span class=\"text\">crontab -e<\/span><\/code>) pomija si\u0119 kolumn\u0119 <code class=\"codecolorer text default\"><span class=\"text\">root<\/span><\/code> i wywo\u0142uje pe\u0142n\u0105 \u015bcie\u017ck\u0119 do <code class=\"codecolorer text default\"><span class=\"text\">indexer<\/span><\/code>. Warto potwierdzi\u0107, \u017ce demon nas\u0142uchuje na porcie z konfiguracji &#8211; bez tego wyszukiwanie sphinx prestashop nie zwr\u00f3ci ID produkt\u00f3w. Je\u015bli start si\u0119 nie udaje, sprawdza si\u0119 uprawnienia do <code class=\"codecolorer text default\"><span class=\"text\">path<\/span><\/code> indeksu i czy inna us\u0142uga nie zajmuje ju\u017c tego portu. Wyszukiwanie sphinx prestashop dzia\u0142a dopiero wtedy, gdy nas\u0142uch odpowiada na zapytania MATCH.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pod\u0142\u0105czenie wyszukiwania sphinx prestashop przez override Search<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">PrestaShop nadal odpowiada za \u0142adowanie produkt\u00f3w, stany magazynowe, obrazy i szablony. Sphinx zwraca tylko pasuj\u0105ce ID produkt\u00f3w. Nadpisuje si\u0119 <code class=\"codecolorer text default\"><span class=\"text\">Search::find<\/span><\/code>, aby te ID pochodzi\u0142y z Sphinx, a nast\u0119pnie wykonuje si\u0119 zwyk\u0142e zapytanie SQL o produkty dla bie\u017c\u0105cego j\u0119zyka i sklepu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W aktualnych wydaniach PrestaShop (1.7 do 9) <code class=\"codecolorer text default\"><span class=\"text\">Search::find<\/span><\/code> nadal przyjmuje podobn\u0105 list\u0119 argument\u00f3w, ale tre\u015b\u0107 metody, obs\u0142uga wyszukiwania rozmytego i SQL produkt\u00f3w zmieni\u0142y si\u0119 znacz\u0105co od wersji 1.6. Nie wkleja si\u0119 starego pliku override na nowoczesny sklep. Otwiera si\u0119 <code class=\"codecolorer text default\"><span class=\"text\">classes\/Search.php<\/span><\/code> sklepu, kopiuje <code class=\"codecolorer text default\"><span class=\"text\">find<\/span><\/code> do <code class=\"codecolorer text default\"><span class=\"text\">\/override\/classes\/Search.php<\/span><\/code>, a nast\u0119pnie zamienia tylko fragment rozwi\u0105zuj\u0105cy pasuj\u0105ce ID produkt\u00f3w na zapytanie Sphinx\/Manticore &#8211; reszta logiki core pozostaje. Poni\u017cszy PHP to <strong>uproszczona ilustracja<\/strong> tej zamiany ID (SphinxSQL na porcie <code class=\"codecolorer text default\"><span class=\"text\">9306<\/span><\/code>, indeks <code class=\"codecolorer text default\"><span class=\"text\">PrestaSite<\/span><\/code>), a nie gotowy override do wklejenia w PrestaShop 9.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\n\/\/ Illustration only - adapt against your shop's classes\/Search.php\n\nprotected static function getSphinxResults($search_query, $offset, $page_size)\n{\n    $results = array();\n    $total = 0;\n\n    if (!$search_query) {\n        return null;\n    }\n\n    \/\/ Port and index name must match your Sphinx\/Manticore config\n    $link = @mysqli_connect('127.0.0.1', '', '', '', 9306);\n    if (!$link) {\n        return array('results' =&gt; $results, 'total' =&gt; $total);\n    }\n\n    $query = 'SELECT id FROM `PrestaSite` WHERE MATCH(''.pSQL($search_query).'') LIMIT '.(int)$offset.', '.(int)$page_size;\n    if ($result = $link-&gt;query($query)) {\n        while ($row = $result-&gt;fetch_assoc()) {\n            if (isset($row['id'])) {\n                $results[] = (int) $row['id'];\n            }\n        }\n        $result-&gt;close();\n    }\n\n    $query_total = 'SELECT count(*) AS c FROM `PrestaSite` WHERE MATCH(''.pSQL($search_query).'')';\n    if ($result = $link-&gt;query($query_total)) {\n        $total = (int) $result-&gt;fetch_assoc()['c'];\n        if ($total &gt; 1000) {\n            $total = 1000;\n        }\n        $result-&gt;close();\n    }\n\n    mysqli_close($link);\n\n    return array('results' =&gt; $results, 'total' =&gt; $total);\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">W override <code class=\"codecolorer text default\"><span class=\"text\">find<\/span><\/code> wywo\u0142uje si\u0119 ten helper, a nast\u0119pnie ogranicza zapytanie produktowe core warunkiem <code class=\"codecolorer text default\"><span class=\"text\">WHERE p.id_product IN (...)<\/span><\/code> z u\u017cyciem zwr\u00f3conych ID (rzutowanych na liczby ca\u0142kowite). To ca\u0142y hak wyszukiwania sphinx prestashop: ID z demona, reszta z PrestaShop. W produkcji warto zadba\u0107 o bezpieczne escapowanie, preferowa\u0107 prepared statements tam, gdzie klient na to pozwala, i wraca\u0107 do natywnego wyszukiwania, gdy demon nie dzia\u0142a. Po zapisaniu override czy\u015bci si\u0119 cache, aby PrestaShop prze\u0142adowa\u0142 klas\u0119.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Czyszczenie cache i weryfikacja wyszukiwania w sklepie<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Cache czy\u015bci si\u0119 w Advanced Parameters \u2192 Performance (oraz usuwa legacy <code class=\"codecolorer text default\"><span class=\"text\">\/cache\/class_index.php<\/span><\/code>, je\u015bli instalacja nadal u\u017cywa tej \u015bcie\u017cki).<\/li>\n<li>Warto potwierdzi\u0107, \u017ce plik override jest czytelny i ma dok\u0142adnie nazw\u0119 <code class=\"codecolorer text default\"><span class=\"text\">Search.php<\/span><\/code> w <code class=\"codecolorer text default\"><span class=\"text\">\/override\/classes\/<\/span><\/code>.<\/li>\n<li>W oknie prywatnym wyszukuje si\u0119 znan\u0105 nazw\u0119 produktu.<\/li>\n<li>Je\u015bli po override pojawia si\u0119 pusta strona, traktuje si\u0119 to jak ka\u017cdy fatalny b\u0142\u0105d PHP &#8211; patrz <a href=\"https:\/\/presta.site\/blog\/pl\/bialy-ekran-smierci-wsod-w-prestashop-przewodnik-krok-po-kroku\/\" data-wpel-link=\"internal\">checklista bia\u0142ego ekranu \u015bmierci<\/a>, a w razie potrzeby przywraca kopi\u0119 zapasow\u0105.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Wyszukiwanie sphinx prestashop to infrastruktura, a nie prze\u0142\u0105cznik w Back Office. Wyszukiwanie sphinx prestashop wymaga, by cron indeksuj\u0105cy dzia\u0142a\u0142 regularnie, dysk przy \u015bcie\u017cce indeksu wymaga monitoringu, a natywne ustawienia wyszukiwania warto przegl\u0105da\u0107 ponownie, gdy problemem jest trafno\u015b\u0107 &#8211; a nie szybko\u015b\u0107.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Skonfiguruj wyszukiwanie sphinx prestashop, aby przyspieszy\u0107 zapytania o produkty w du\u017cych katalogach. Zainstaluj Sphinx, zindeksuj produkty i pod\u0142\u0105cz override Search.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[149],"tags":[],"class_list":["post-1061","post","type-post","status-publish","format-standard","hentry","category-rozwoj"],"_links":{"self":[{"href":"https:\/\/presta.site\/blog\/wp-json\/wp\/v2\/posts\/1061","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/presta.site\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/presta.site\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/presta.site\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/presta.site\/blog\/wp-json\/wp\/v2\/comments?post=1061"}],"version-history":[{"count":1,"href":"https:\/\/presta.site\/blog\/wp-json\/wp\/v2\/posts\/1061\/revisions"}],"predecessor-version":[{"id":1984,"href":"https:\/\/presta.site\/blog\/wp-json\/wp\/v2\/posts\/1061\/revisions\/1984"}],"wp:attachment":[{"href":"https:\/\/presta.site\/blog\/wp-json\/wp\/v2\/media?parent=1061"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/presta.site\/blog\/wp-json\/wp\/v2\/categories?post=1061"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/presta.site\/blog\/wp-json\/wp\/v2\/tags?post=1061"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}