Busqueda Sphinx PrestaShop: catálogo más rápido en tiendas grandes

La búsqueda nativa del catálogo basta en tiendas pequeñas. En catálogos grandes puede ir lenta con cada pulsación y cada reindexado. La busqueda sphinx prestashop mueve la coincidencia de texto completo a un motor dedicado para que las consultas de productos sigan siendo rápidas mientras PrestaShop sigue renderizando las fichas.

Sphinx es un servidor de búsqueda de texto completo. Indexas campos de producto desde MySQL, ejecutas un demonio de búsqueda y sobrescribes Search::find de PrestaShop para que las consultas de la tienda lleguen a ese motor en lugar del índice integrado. En la práctica importan dos líneas tecnológicas: Sphinx (sigue en desarrollo; las compilaciones actuales de Sphinx 3 difieren de los paquetes open source clásicos 2.x) y Manticore Search (un fork open source de Sphinx 2.x). Las rutas de instalación y los ejemplos de configuración siguen paquetes al estilo Sphinx 2 clásico, como sphinxsearch en Debian/Ubuntu. Con Manticore o Sphinx 3, espera nombres de paquete, directorios de configuración y puertos de escucha distintos – conserva la misma idea (indexar IDs de producto y consultarlos desde PHP).

Antes de comprometerte con un demonio y un override, prueba primero las herramientas nativas – alias, coincidencia difusa y pesos suelen corregir resultados pobres sin nueva infraestructura. Repásalas en nuestra guía de configuración de búsqueda en PrestaShop. Las etiquetas oficiales de opciones para tiendas actuales están en la documentación de parámetros de búsqueda de PrestaShop 9.

Cuándo merece la pena la busqueda sphinx prestashop

Sphinx compensa cuando:

  • La búsqueda de productos o las reconstrucciones del índice se sienten lentas con tráfico real.
  • Necesitas morfología o stemming más allá de lo que ofrece Shop Parameters → Search.
  • Te sientes cómodo ejecutando un servicio pequeño en el mismo host (o uno cercano) y manteniendo un cron de indexación sano.

Omítelo si el catálogo es modesto y el problema es solo la relevancia – corrige primero indexación, alias y pesos. Haz también una copia de seguridad completa de PrestaShop antes de cualquier override de clase; un Search.php mal hecho puede dejar en blanco la página de búsqueda de la tienda.

Instalar Sphinx en el servidor

Los nombres de paquete varían según la distro. En Debian/Ubuntu, si el paquete clásico está disponible:

sudo apt-get update
sudo apt-get install sphinxsearch

Ese paquete sigue presente en varias versiones de Debian, pero corresponde a la línea antigua Sphinx 2 – no a Sphinx 3. Si sphinxsearch no está en tus repos, o quieres una compilación open source mantenida, instala Manticore siguiendo sus instrucciones actuales para Debian/Ubuntu. Evita fijar nombres de .deb antiguos copiados de tutoriales viejos (por ejemplo paquetes Sphinx 2.2 de la era Wheezy) – usa lo que documente hoy tu distro o proveedor.

Las rutas siguientes asumen un diseño clásico bajo /etc/sphinxsearch/. Manticore suele usar /etc/manticoresearch/. Anota el puerto SQL de escucha de la documentación de instalación antes de apuntar la busqueda sphinx prestashop al demonio (Sphinx clásico solía usar 9306; otras compilaciones difieren).

Configurar el origen y el índice de Sphinx

Edita la configuración (a menudo /etc/sphinxsearch/sphinx.conf):

sudo nano /etc/sphinxsearch/sphinx.conf

Define un origen MySQL que extraiga los campos que quieras buscables. Sustituye credenciales y prefijo de tabla por los de tu tienda (ps_ es el prefijo por defecto de 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
}

La primera columna de sql_query se convierte en el ID de documento que devuelve Sphinx – aquí es id_product. La consulta es intencionalmente mínima. Tiendas multilingües o multitienda suelen filtrar por id_lang / tienda, o construir un índice por idioma. Deja los bloques de indexer y del demonio de búsqueda con valores razonables salvo que sepas que necesitas puertos o rutas de log personalizados. En Sphinx 3 o Manticore, la sintaxis de configuración puede variar; mapea las mismas piezas (credenciales de BD, SELECT de campos de producto, ruta del índice).

Construir el índice e iniciar el demonio de búsqueda

Indexa una vez y luego inicia el demonio. Sphinx clásico usa indexer / searchd; algunos paquetes envuelven los mismos pasos en systemctl:

sudo indexer --all
sudo searchd

Actualiza según un horario para que productos nuevos y editados aparezcan en los resultados. Cada hora es un punto de partida habitual. En /etc/crontab (crontab del sistema, que incluye una columna de usuario):

15 * * * * root indexer --all

Si usas un crontab de usuario (crontab -e), quita la columna root y llama a la ruta completa de indexer. Confirma que el demonio escucha en el puerto que declara tu configuración. Si no arranca, revisa permisos en la path del índice y que nada más ocupe ese puerto. La busqueda sphinx prestashop solo funciona cuando este listener responde a consultas MATCH.

Conectar la busqueda sphinx prestashop con un override de Search

PrestaShop sigue gestionando la carga de productos, stock, imágenes y plantillas. Sphinx solo devuelve IDs de producto coincidentes. Sobrescribes Search::find para que esos IDs vengan de Sphinx y luego ejecutas un SQL de producto normal para el idioma y la tienda actuales.

En versiones actuales de PrestaShop (de la 1.7 a la 9), Search::find sigue recibiendo una lista de argumentos similar, pero el cuerpo del método, el manejo de búsqueda 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 classes/Search.php de tu tienda, copia find en /override/classes/Search.php y sustituye solo la parte que resuelve los IDs de producto coincidentes por una consulta Sphinx/Manticore – conserva el resto de la lógica del núcleo. El PHP siguiente es una ilustración simplificada de ese intercambio de IDs (SphinxSQL en el puerto 9306, nombre de índice PrestaSite), no un override listo para pegar en 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);
}

En tu override de find, llama a ese helper y restringe la consulta de productos del núcleo con WHERE p.id_product IN (...) usando los IDs devueltos (convertidos a enteros). Ese es el gancho completo de la busqueda sphinx prestashop: IDs del demonio, todo lo demás desde PrestaShop. Refuerza para producción: escapa con cuidado, prefiere sentencias preparadas donde el cliente lo permita y vuelve a la búsqueda nativa si el demonio está caído. Tras guardar el override, limpia cachés para que PrestaShop recargue la clase.

Limpiar caché y verificar la búsqueda de la tienda

  • Limpia la caché desde Advanced Parameters → Performance (y elimina un /cache/class_index.php heredado si tu instalación aún usa esa ruta).
  • Confirma que el archivo override es legible y se llama exactamente Search.php bajo /override/classes/.
  • Busca un nombre de producto conocido en una ventana privada.
  • Si obtienes una página en blanco tras el override, trátalo como cualquier error fatal de PHP – consulta nuestra lista de comprobación de pantalla blanca de la muerte y restaura la copia de seguridad si hace falta.

La busqueda sphinx prestashop es infraestructura, no un interruptor del Back Office. Mantén el cron del indexer al día, vigila el disco en la ruta del índice y revisa la configuración de búsqueda nativa cuando la queja real sea la relevancia – no la velocidad.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *