--- title: "Cómo instalar Manticore Search en Ubuntu 24.04" description: "Instala Manticore Search desde su repositorio oficial en Ubuntu 24.04, crea una tabla en tiempo real con SQL y haz búsquedas full-text con facetas y resaltado." category: "Motores de Búsqueda" language: es source: https://cubepath.com/es/docs/motores-de-búsqueda/instalacion-y-configuracion-de-manticoresearch updated: 2026-09-25 --- # Cómo instalar Manticore Search en Ubuntu 24.04 Manticore Search es un motor de búsqueda de texto completo de código abierto, heredero de Sphinx, que se consulta con SQL a través del protocolo de MySQL o con JSON a través de HTTP. Eso permite conectarte con el cliente `mysql` de siempre o con cualquier librería MySQL para crear tablas, insertar documentos y buscar. En este tutorial instalarás Manticore Search desde su repositorio oficial en Ubuntu 24.04, crearás una tabla en tiempo real con análisis de texto en español y harás búsquedas con filtros, facetas y resaltado de términos. ## Requisitos previos Para seguir esta guía necesitas: - Un servidor con Ubuntu 24.04 LTS, por ejemplo un VPS de CubePath. - Un usuario no root con privilegios `sudo`. - Al menos 1 GB de RAM (2 GB o más para índices grandes) y espacio en disco acorde a tus datos. Manticore escucha por defecto solo en `127.0.0.1`, así que no hace falta abrir puertos para seguir esta guía. Usa tres puertos: | Puerto | Protocolo | Uso | |--------|-----------|-----| | 9306 | MySQL | Consultas SQL con cualquier cliente MySQL | | 9308 | HTTP | API JSON y endpoint `/sql` | | 9312 | Binario | Protocolo nativo, usado entre nodos y por clientes antiguos de Sphinx | ## Paso 1: Añadir el repositorio de Manticore Manticore distribuye un pequeño paquete que configura su repositorio APT e instala la clave de firma en `/usr/share/keyrings`. Descárgalo e instálalo: ```bash cd /tmp wget https://repo.manticoresearch.com/manticore-repo.noarch.deb sudo dpkg -i manticore-repo.noarch.deb sudo apt update ``` Comprueba que APT ya ve los paquetes de Manticore: ```bash apt-cache policy manticore ``` La salida debe mostrar una versión candidata procedente de `repo.manticoresearch.com`. ## Paso 2: Instalar e iniciar Manticore Search Instala el servidor junto con la librería columnar, que añade el almacenamiento columnar y los índices secundarios que aceleran los filtros: ```bash sudo apt install manticore manticore-columnar-lib ``` El servicio no arranca automáticamente tras la instalación. Habilítalo e inícialo: ```bash sudo systemctl enable --now manticore ``` Comprueba que está activo y escuchando en los tres puertos: ```bash sudo systemctl status manticore sudo ss -tlnp | grep searchd ``` ```output LISTEN 0 4096 127.0.0.1:9306 0.0.0.0:* users:(("searchd",pid=5312,fd=12)) LISTEN 0 4096 127.0.0.1:9308 0.0.0.0:* users:(("searchd",pid=5312,fd=13)) LISTEN 0 4096 127.0.0.1:9312 0.0.0.0:* users:(("searchd",pid=5312,fd=11)) ``` ## Paso 3: Revisar la configuración La configuración está en `/etc/manticoresearch/manticore.conf`. Muéstrala: ```bash cat /etc/manticoresearch/manticore.conf ``` Verás un bloque `searchd` parecido a este: ```ini searchd { listen = 127.0.0.1:9312 listen = 127.0.0.1:9306:mysql listen = 127.0.0.1:9308:http log = /var/log/manticore/searchd.log query_log = /var/log/manticore/query.log pid_file = /run/manticore/searchd.pid data_dir = /var/lib/manticore } ``` La directiva `data_dir` activa el modo RT (en tiempo real): las tablas se crean y modifican con sentencias SQL como `CREATE TABLE` y Manticore guarda su definición en ese directorio, sin tocar el archivo de configuración. Es el modo recomendado para aplicaciones nuevas y el que usarás en esta guía. Si más adelante otra máquina necesita conectarse, cambia `127.0.0.1` por la IP privada del servidor en las líneas `listen` y permite el acceso solo desde esa máquina con UFW, por ejemplo `sudo ufw allow from 10.0.0.5 to any port 9306 proto tcp`. Manticore no tiene autenticación propia, así que nunca expongas estos puertos a Internet. ## Paso 4: Conectarte con el cliente MySQL Instala el cliente de MySQL: ```bash sudo apt install mysql-client ``` Conéctate al puerto SQL de Manticore. No necesita usuario ni contraseña: ```bash mysql -h 127.0.0.1 -P 9306 ``` Comprueba que todo responde listando las tablas, que de momento no existen: ```sql SHOW TABLES; ``` ```output Empty set (0.00 sec) ``` Todas las sentencias SQL de los siguientes pasos se ejecutan dentro de esta sesión. ## Paso 5: Crear una tabla en tiempo real Crea una tabla de productos. Los campos `text` son los que se indexan para búsqueda de texto completo; el resto son atributos que sirven para filtrar, ordenar y agrupar. `morphology = 'libstemmer_es'` aplica el stemmer de español, de modo que "zapatilla" y "zapatillas" se consideran la misma palabra, y `min_prefix_len = '3'` permite buscar por prefijo con un asterisco (`zapat*`): ```sql CREATE TABLE productos ( nombre text, descripcion text, categoria string, marca string, precio float, stock integer, activo bool ) morphology = 'libstemmer_es' min_prefix_len = '3'; ``` Comprueba la estructura: ```sql DESCRIBE productos; ``` ```output +-------------+--------+----------------+ | Field | Type | Properties | +-------------+--------+----------------+ | id | bigint | | | nombre | text | indexed stored | | descripcion | text | indexed stored | | categoria | string | | | marca | string | | | precio | float | | | stock | uint | | | activo | bool | | +-------------+--------+----------------+ ``` El campo `id` se añade automáticamente. Los campos de texto son `stored`, lo que significa que Manticore guarda también el texto original y puede devolverlo en los resultados. ## Paso 6: Insertar y modificar documentos Inserta varios productos. Si no indicas un `id`, Manticore genera uno único: ```sql INSERT INTO productos (id, nombre, descripcion, categoria, marca, precio, stock, activo) VALUES (1, 'Camiseta básica de algodón', 'Camiseta unisex de algodón 100% en varios colores', 'Ropa', 'BasicWear', 19.99, 150, 1), (2, 'Zapatillas de running', 'Zapatillas ligeras para correr con amortiguación', 'Calzado', 'SpeedRun', 89.99, 45, 1), (3, 'Zapatillas de montaña', 'Calzado resistente para senderismo y trail', 'Calzado', 'TrailPro', 119.00, 12, 1), (4, 'Sudadera deportiva', 'Sudadera de algodón con capucha para entrenar', 'Ropa', 'SpeedRun', 39.90, 0, 0); ``` ```output Query OK, 4 rows affected (0.00 sec) ``` Los documentos se pueden buscar en cuanto termina el `INSERT`. Para cambiar atributos (precio, stock, estado) usa `UPDATE`, que es inmediato: ```sql UPDATE productos SET precio = 17.99, stock = 200 WHERE id = 1; ``` Los campos de texto no se pueden modificar con `UPDATE`. Para cambiarlos, sustituye el documento completo con `REPLACE`, que tiene la misma sintaxis que `INSERT`. Para borrar, usa `DELETE FROM productos WHERE id = 4;`. ## Paso 7: Buscar con texto completo y filtros La búsqueda de texto completo se hace con `MATCH()` dentro del `WHERE`, y se puede combinar con filtros sobre atributos. `WEIGHT()` devuelve la puntuación de relevancia: ```sql SELECT id, nombre, precio, WEIGHT() AS relevancia FROM productos WHERE MATCH('zapatilla') AND activo = 1 AND precio < 100 ORDER BY relevancia DESC; ``` ```output +------+-----------------------+-----------+------------+ | id | nombre | precio | relevancia | +------+-----------------------+-----------+------------+ | 2 | Zapatillas de running | 89.989998 | 2552 | +------+-----------------------+-----------+------------+ ``` Aunque buscaste "zapatilla" en singular, el stemmer encuentra "Zapatillas". El producto 3 también coincide, pero el filtro de precio lo excluye. El lenguaje de consulta de `MATCH()` admite operadores para búsquedas más precisas: | Consulta | Significado | |----------|-------------| | `MATCH('@nombre camiseta')` | Busca solo en el campo `nombre` | | `MATCH('algodón -sudadera')` | Contiene "algodón" pero no "sudadera" | | `MATCH('running \| trail')` | Contiene cualquiera de las dos palabras | | `MATCH('"zapatillas running"~3')` | Las dos palabras a menos de 3 posiciones | | `MATCH('zapat*')` | Palabras que empiezan por "zapat" | ## Paso 8: Facetas y resaltado de resultados Las facetas devuelven, junto con los resultados, cuántos documentos hay por cada valor de un atributo. Es lo que alimenta los filtros laterales de una tienda. Cada `FACET` genera un conjunto de resultados adicional: ```sql SELECT id, nombre, precio FROM productos WHERE MATCH('algodón | zapatillas') FACET categoria ORDER BY COUNT(*) DESC FACET marca; ``` ```output +------+-----------------------------+-----------+ | id | nombre | precio | +------+-----------------------------+-----------+ ... +-----------+----------+ | categoria | count(*) | +-----------+----------+ | Calzado | 2 | | Ropa | 2 | +-----------+----------+ ... ``` `HIGHLIGHT()` devuelve fragmentos del texto original con los términos buscados marcados, listos para mostrar en una página de resultados: ```sql SELECT id, HIGHLIGHT({before_match='', after_match=''}, 'descripcion') AS fragmento FROM productos WHERE MATCH('algodón'); ``` ```output +------+------------------------------------------------------------+ | id | fragmento | +------+------------------------------------------------------------+ | 1 | Camiseta unisex de algodón 100% en varios colores | | 4 | Sudadera de algodón con capucha para entrenar | +------+------------------------------------------------------------+ ``` Sal del cliente con `exit`. ## Paso 9: Consultar desde la API HTTP Si tu aplicación no usa una librería MySQL, puedes usar la API JSON del puerto 9308. Esta petición equivale a una búsqueda de "zapatillas" con un filtro de precio: ```bash curl -s http://127.0.0.1:9308/search -d '{ "table": "productos", "query": { "bool": { "must": [{"match": {"*": "zapatillas"}}], "filter": [{"range": {"precio": {"lte": 150}}}] } }, "limit": 10 }' ``` La respuesta sigue un formato parecido al de Elasticsearch, con los documentos en `hits.hits` y el total en `hits.total`. También puedes enviar SQL directamente por HTTP con el endpoint `/sql`: ```bash curl -s "http://127.0.0.1:9308/sql?mode=raw" -d "SELECT COUNT(*) FROM productos" ``` ## Solución de problemas **El servicio no arranca.** Revisa el log de Manticore y el de systemd: ```bash sudo tail -n 50 /var/log/manticore/searchd.log sudo journalctl -u manticore -n 50 --no-pager ``` Un error de sintaxis en `manticore.conf` aparece al principio del log con el número de línea. Si has cambiado las líneas `listen`, comprueba que no hay otro proceso usando esos puertos con `sudo ss -tlnp`. **`ERROR 2003 (HY000): Can't connect to MySQL server`.** Comprueba que indicas el puerto 9306 con `-P 9306` y la IP `127.0.0.1`. Si escribes `localhost`, el cliente intenta usar un socket Unix en lugar de TCP. **Una búsqueda por prefijo no devuelve resultados.** `MATCH('zap*')` solo funciona si la tabla tiene `min_prefix_len` o `min_infix_len` y el prefijo es al menos igual de largo que ese valor. Estos ajustes se aplican al indexar, así que cambiarlos en una tabla existente requiere volver a insertar los datos. **La tabla crece mucho tras muchas escrituras.** Las tablas RT se compactan solas en segundo plano. Puedes consultar su estado con `SHOW TABLE productos STATUS;` y forzar una compactación con `OPTIMIZE TABLE productos;`. ## Conclusión Tienes Manticore Search funcionando en Ubuntu 24.04 con una tabla en tiempo real, análisis de texto en español y consultas con filtros, facetas y resaltado, tanto por SQL como por HTTP. Como siguientes pasos, puedes conectar tu aplicación mediante su librería MySQL habitual, importar datos existentes de MySQL o PostgreSQL con la herramienta `indexer`, o crear un clúster con replicación entre varios nodos para alta disponibilidad.