{"id":981,"date":"2021-10-22T15:18:50","date_gmt":"2021-10-22T12:18:50","guid":{"rendered":"https:\/\/presta.site\/blog\/uso-de-la-busqueda-sphinx-en-prestashop\/"},"modified":"2026-07-24T15:00:59","modified_gmt":"2026-07-24T12:00:59","slug":"uso-de-la-busqueda-sphinx-en-prestashop","status":"publish","type":"post","link":"https:\/\/presta.site\/blog\/es\/uso-de-la-busqueda-sphinx-en-prestashop\/","title":{"rendered":"Busqueda Sphinx PrestaShop: cat\u00e1logo m\u00e1s r\u00e1pido en tiendas grandes"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">La b\u00fasqueda nativa del cat\u00e1logo basta en tiendas peque\u00f1as. En cat\u00e1logos grandes puede ir lenta con cada pulsaci\u00f3n y cada reindexado. La <strong>busqueda sphinx prestashop<\/strong> mueve la coincidencia de texto completo a un motor dedicado para que las consultas de productos sigan siendo r\u00e1pidas mientras PrestaShop sigue renderizando las fichas.<\/p>\n\n\n<!--more-->\n\n\n<p class=\"wp-block-paragraph\">Sphinx es un servidor de b\u00fasqueda de texto completo. Indexas campos de producto desde MySQL, ejecutas un demonio de b\u00fasqueda y sobrescribes <code class=\"codecolorer text default\"><span class=\"text\">Search::find<\/span><\/code> de PrestaShop para que las consultas de la tienda lleguen a ese motor en lugar del \u00edndice integrado. En la pr\u00e1ctica importan dos l\u00edneas tecnol\u00f3gicas: <a href=\"https:\/\/sphinxsearch.com\/\" target=\"_blank\" rel=\"noopener noreferrer external\" data-wpel-link=\"external\">Sphinx<\/a> (sigue en desarrollo; las compilaciones actuales de Sphinx 3 difieren de los paquetes open source cl\u00e1sicos 2.x) y <a href=\"https:\/\/manticoresearch.com\/\" target=\"_blank\" rel=\"noopener noreferrer external\" data-wpel-link=\"external\">Manticore Search<\/a> (un fork open source de Sphinx 2.x). Las rutas de instalaci\u00f3n y los ejemplos de configuraci\u00f3n siguen paquetes al estilo Sphinx 2 cl\u00e1sico, como <code class=\"codecolorer text default\"><span class=\"text\">sphinxsearch<\/span><\/code> en Debian\/Ubuntu. Con Manticore o Sphinx 3, espera nombres de paquete, directorios de configuraci\u00f3n y puertos de escucha distintos &#8211; conserva la misma idea (indexar IDs de producto y consultarlos desde PHP).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de comprometerte con un demonio y un override, prueba primero las herramientas nativas &#8211; alias, coincidencia difusa y pesos suelen corregir resultados pobres sin nueva infraestructura. Rep\u00e1salas en nuestra <a href=\"https:\/\/presta.site\/blog\/es\/guia-rapida-para-configurar-la-busqueda-en-prestashop\/\" data-wpel-link=\"internal\">gu\u00eda de configuraci\u00f3n de b\u00fasqueda en PrestaShop<\/a>. Las etiquetas oficiales de opciones para tiendas actuales est\u00e1n en la <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\">documentaci\u00f3n de par\u00e1metros de b\u00fasqueda de PrestaShop 9<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Cu\u00e1ndo merece la pena la busqueda sphinx prestashop<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Sphinx compensa cuando:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>La b\u00fasqueda de productos o las reconstrucciones del \u00edndice se sienten lentas con tr\u00e1fico real.<\/li>\n<li>Necesitas morfolog\u00eda o stemming m\u00e1s all\u00e1 de lo que ofrece Shop Parameters \u2192 Search.<\/li>\n<li>Te sientes c\u00f3modo ejecutando un servicio peque\u00f1o en el mismo host (o uno cercano) y manteniendo un cron de indexaci\u00f3n sano.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Om\u00edtelo si el cat\u00e1logo es modesto y el problema es solo la relevancia &#8211; corrige primero indexaci\u00f3n, alias y pesos. Haz tambi\u00e9n una <a href=\"https:\/\/presta.site\/blog\/es\/como-crear-una-copia-de-seguridad-en-prestashop\/\" data-wpel-link=\"internal\">copia de seguridad completa de PrestaShop<\/a> antes de cualquier override de clase; un <code class=\"codecolorer text default\"><span class=\"text\">Search.php<\/span><\/code> mal hecho puede dejar en blanco la p\u00e1gina de b\u00fasqueda de la tienda.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Instalar Sphinx en el servidor<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Los nombres de paquete var\u00edan seg\u00fan la distro. En Debian\/Ubuntu, si el paquete cl\u00e1sico est\u00e1 disponible:<\/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\">Ese paquete sigue presente en varias versiones de Debian, pero corresponde a la l\u00ednea antigua Sphinx 2 &#8211; no a Sphinx 3. Si <code class=\"codecolorer text default\"><span class=\"text\">sphinxsearch<\/span><\/code> no est\u00e1 en tus repos, o quieres una compilaci\u00f3n open source mantenida, instala <a href=\"https:\/\/manticoresearch.com\/\" target=\"_blank\" rel=\"noopener noreferrer external\" data-wpel-link=\"external\">Manticore<\/a> siguiendo sus instrucciones actuales para Debian\/Ubuntu. Evita fijar nombres de <code class=\"codecolorer text default\"><span class=\"text\">.deb<\/span><\/code> antiguos copiados de tutoriales viejos (por ejemplo paquetes Sphinx 2.2 de la era Wheezy) &#8211; usa lo que documente hoy tu distro o proveedor.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Las rutas siguientes asumen un dise\u00f1o cl\u00e1sico bajo <code class=\"codecolorer text default\"><span class=\"text\">\/etc\/sphinxsearch\/<\/span><\/code>. Manticore suele usar <code class=\"codecolorer text default\"><span class=\"text\">\/etc\/manticoresearch\/<\/span><\/code>. Anota el puerto SQL de escucha de la documentaci\u00f3n de instalaci\u00f3n antes de apuntar la busqueda sphinx prestashop al demonio (Sphinx cl\u00e1sico sol\u00eda usar <code class=\"codecolorer text default\"><span class=\"text\">9306<\/span><\/code>; otras compilaciones difieren).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Configurar el origen y el \u00edndice de Sphinx<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Edita la configuraci\u00f3n (a menudo <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\">Define un origen MySQL que extraiga los campos que quieras buscables. Sustituye credenciales y prefijo de tabla por los de tu tienda (<code class=\"codecolorer text default\"><span class=\"text\">ps_<\/span><\/code> es el prefijo por defecto de 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\">La primera columna de <code class=\"codecolorer text default\"><span class=\"text\">sql_query<\/span><\/code> se convierte en el ID de documento que devuelve Sphinx &#8211; aqu\u00ed es <code class=\"codecolorer text default\"><span class=\"text\">id_product<\/span><\/code>. La consulta es intencionalmente m\u00ednima. Tiendas multiling\u00fces o multitienda suelen filtrar por <code class=\"codecolorer text default\"><span class=\"text\">id_lang<\/span><\/code> \/ tienda, o construir un \u00edndice por idioma. Deja los bloques de indexer y del demonio de b\u00fasqueda con valores razonables salvo que sepas que necesitas puertos o rutas de log personalizados. En Sphinx 3 o Manticore, la sintaxis de configuraci\u00f3n puede variar; mapea las mismas piezas (credenciales de BD, SELECT de campos de producto, ruta del \u00edndice).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Construir el \u00edndice e iniciar el demonio de b\u00fasqueda<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Indexa una vez y luego inicia el demonio. Sphinx cl\u00e1sico usa <code class=\"codecolorer text default\"><span class=\"text\">indexer<\/span><\/code> \/ <code class=\"codecolorer text default\"><span class=\"text\">searchd<\/span><\/code>; algunos paquetes envuelven los mismos pasos en <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\">Actualiza seg\u00fan un horario para que productos nuevos y editados aparezcan en los resultados. Cada hora es un punto de partida habitual. En <code class=\"codecolorer text default\"><span class=\"text\">\/etc\/crontab<\/span><\/code> (crontab del sistema, que incluye una columna de usuario):<\/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\">Si usas un crontab de usuario (<code class=\"codecolorer text default\"><span class=\"text\">crontab -e<\/span><\/code>), quita la columna <code class=\"codecolorer text default\"><span class=\"text\">root<\/span><\/code> y llama a la ruta completa de <code class=\"codecolorer text default\"><span class=\"text\">indexer<\/span><\/code>. Confirma que el demonio escucha en el puerto que declara tu configuraci\u00f3n. Si no arranca, revisa permisos en la <code class=\"codecolorer text default\"><span class=\"text\">path<\/span><\/code> del \u00edndice y que nada m\u00e1s ocupe ese puerto. La busqueda sphinx prestashop solo funciona cuando este listener responde a consultas MATCH.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conectar la busqueda sphinx prestashop con un override de Search<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">PrestaShop sigue gestionando la carga de productos, stock, im\u00e1genes y plantillas. Sphinx solo devuelve IDs de producto coincidentes. Sobrescribes <code class=\"codecolorer text default\"><span class=\"text\">Search::find<\/span><\/code> para que esos IDs vengan de Sphinx y luego ejecutas un SQL de producto normal para el idioma y la tienda actuales.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En versiones actuales de PrestaShop (de la 1.7 a la 9), <code class=\"codecolorer text default\"><span class=\"text\">Search::find<\/span><\/code> sigue recibiendo una lista de argumentos similar, pero el cuerpo del m\u00e9todo, el manejo de b\u00fasqueda difusa y el SQL de productos han cambiado mucho desde la 1.6. No copies un archivo override antiguo en una tienda moderna. Abre el <code class=\"codecolorer text default\"><span class=\"text\">classes\/Search.php<\/span><\/code> de tu tienda, copia <code class=\"codecolorer text default\"><span class=\"text\">find<\/span><\/code> en <code class=\"codecolorer text default\"><span class=\"text\">\/override\/classes\/Search.php<\/span><\/code> y sustituye solo la parte que resuelve los IDs de producto coincidentes por una consulta Sphinx\/Manticore &#8211; conserva el resto de la l\u00f3gica del n\u00facleo. El PHP siguiente es una <strong>ilustraci\u00f3n simplificada<\/strong> de ese intercambio de IDs (SphinxSQL en el puerto <code class=\"codecolorer text default\"><span class=\"text\">9306<\/span><\/code>, nombre de \u00edndice <code class=\"codecolorer text default\"><span class=\"text\">PrestaSite<\/span><\/code>), no un override listo para pegar en 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\">En tu override de <code class=\"codecolorer text default\"><span class=\"text\">find<\/span><\/code>, llama a ese helper y restringe la consulta de productos del n\u00facleo con <code class=\"codecolorer text default\"><span class=\"text\">WHERE p.id_product IN (...)<\/span><\/code> usando los IDs devueltos (convertidos a enteros). Ese es el gancho completo de la busqueda sphinx prestashop: IDs del demonio, todo lo dem\u00e1s desde PrestaShop. Refuerza para producci\u00f3n: escapa con cuidado, prefiere sentencias preparadas donde el cliente lo permita y vuelve a la b\u00fasqueda nativa si el demonio est\u00e1 ca\u00eddo. Tras guardar el override, limpia cach\u00e9s para que PrestaShop recargue la clase.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Limpiar cach\u00e9 y verificar la b\u00fasqueda de la tienda<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Limpia la cach\u00e9 desde Advanced Parameters \u2192 Performance (y elimina un <code class=\"codecolorer text default\"><span class=\"text\">\/cache\/class_index.php<\/span><\/code> heredado si tu instalaci\u00f3n a\u00fan usa esa ruta).<\/li>\n<li>Confirma que el archivo override es legible y se llama exactamente <code class=\"codecolorer text default\"><span class=\"text\">Search.php<\/span><\/code> bajo <code class=\"codecolorer text default\"><span class=\"text\">\/override\/classes\/<\/span><\/code>.<\/li>\n<li>Busca un nombre de producto conocido en una ventana privada.<\/li>\n<li>Si obtienes una p\u00e1gina en blanco tras el override, tr\u00e1talo como cualquier error fatal de PHP &#8211; consulta nuestra <a href=\"https:\/\/presta.site\/blog\/es\/pantalla-blanca-de-la-muerte-en-prestashop-una-guia-paso-a-paso\/\" data-wpel-link=\"internal\">lista de comprobaci\u00f3n de pantalla blanca de la muerte<\/a> y restaura la copia de seguridad si hace falta.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">La busqueda sphinx prestashop es infraestructura, no un interruptor del Back Office. Mant\u00e9n el cron del indexer al d\u00eda, vigila el disco en la ruta del \u00edndice y revisa la configuraci\u00f3n de b\u00fasqueda nativa cuando la queja real sea la relevancia &#8211; no la velocidad.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Configura la busqueda sphinx prestashop para acelerar consultas de productos en cat\u00e1logos grandes. Instala Sphinx, indexa productos y conecta un override de Search.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[123],"tags":[],"class_list":["post-981","post","type-post","status-publish","format-standard","hentry","category-desarrollo"],"_links":{"self":[{"href":"https:\/\/presta.site\/blog\/wp-json\/wp\/v2\/posts\/981","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=981"}],"version-history":[{"count":1,"href":"https:\/\/presta.site\/blog\/wp-json\/wp\/v2\/posts\/981\/revisions"}],"predecessor-version":[{"id":1982,"href":"https:\/\/presta.site\/blog\/wp-json\/wp\/v2\/posts\/981\/revisions\/1982"}],"wp:attachment":[{"href":"https:\/\/presta.site\/blog\/wp-json\/wp\/v2\/media?parent=981"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/presta.site\/blog\/wp-json\/wp\/v2\/categories?post=981"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/presta.site\/blog\/wp-json\/wp\/v2\/tags?post=981"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}