Instalación y Configuración de ManticoreSearch
ManticoreSearch es un motor de búsqueda de texto completo de alto rendimiento compatible con la sintaxis de Sphinx y MySQL, que ofrece una interfaz SQL nativa para indexar y consultar datos de forma familiar. Con soporte para índices en tiempo real, replicación, búsqueda distribuida y una API HTTP compatible con Elasticsearch, ManticoreSearch combina la velocidad de Sphinx con las comodidades de un motor moderno. Esta guía cubre la instalación en Linux, creación de índices, integración con bases de datos y configuración para producción.
Requisitos Previos
- Ubuntu 20.04/22.04, Debian 11+ o CentOS 8+/Rocky Linux 8+
- 1 GB de RAM mínimo (4 GB recomendado)
- 10 GB de espacio en disco
- Puerto 9306 (MySQL protocol), 9308 (HTTP API) y 9312 (binary API)
Instalación de ManticoreSearch
Instalación en Ubuntu/Debian
# Descargar e instalar el paquete de configuración del repositorio
wget https://repo.manticoresearch.com/manticore-repo.noarch.deb
sudo dpkg -i manticore-repo.noarch.deb
sudo apt update
# Instalar ManticoreSearch y sus herramientas auxiliares
sudo apt install -y manticore manticore-extra
# Habilitar e iniciar el servicio
sudo systemctl enable manticore --now
sudo systemctl status manticore
Instalación en CentOS/Rocky Linux
# Instalar el repositorio
sudo rpm --import https://repo.manticoresearch.com/GPG-KEY-manticore
sudo dnf install -y https://repo.manticoresearch.com/manticore-repo.noarch.rpm
# Instalar
sudo dnf install -y manticore manticore-extra
# Habilitar e iniciar
sudo systemctl enable manticore --now
Instalación con Docker
docker run -d \
--name manticore \
-p 9306:9306 \
-p 9308:9308 \
-v manticore-data:/var/lib/manticore \
manticoresearch/manticore:latest
# Conectar con cliente MySQL para verificar
mysql -h 127.0.0.1 -P 9306
Configuración Básica
El archivo principal de configuración es /etc/manticoresearch/manticore.conf:
# /etc/manticoresearch/manticore.conf
searchd {
# Puerto para protocolo MySQL (compatible con clientes mysql)
listen = 127.0.0.1:9306:mysql
# Puerto para API HTTP (compatible con Elasticsearch)
listen = 127.0.0.1:9308:http
# Puerto para API binaria (Sphinx)
listen = 127.0.0.1:9312
# Directorio de logs
log = /var/log/manticoresearch/searchd.log
query_log = /var/log/manticoresearch/query.log
# Directorio de datos
data_dir = /var/lib/manticore
# Identificador de proceso
pid_file = /run/manticoresearch/searchd.pid
# Tiempo máximo de espera de consulta (segundos)
query_timeout = 60
# Número de hilos de trabajo
workers = 4
}
# Verificar la configuración
sudo -u manticore searchd --config /etc/manticoresearch/manticore.conf --test
# Reiniciar para aplicar cambios
sudo systemctl restart manticore
# Conectar via MySQL protocol para probar
mysql -h 127.0.0.1 -P 9306
Tipos de Índices
ManticoreSearch soporta tres tipos principales de índices:
- Plain Index: índice de solo lectura creado desde una fuente de datos (reemplaza a los índices de Sphinx)
- Real-Time Index (RT): índice con escrituras y actualizaciones en tiempo real
- Distributed Index: índice distribuido que consulta múltiples índices locales o remotos
Índices en Tiempo Real
Los índices RT son los más versátiles para aplicaciones modernas:
-- Conectarse a ManticoreSearch con MySQL
-- mysql -h 127.0.0.1 -P 9306
-- Crear un índice RT para productos
CREATE TABLE productos (
id BIGINT,
nombre TEXT,
descripcion TEXT,
categoria STRING,
marca STRING,
precio FLOAT,
stock INTEGER,
activo BOOL,
fecha_alta TIMESTAMP,
etiquetas STRING ATTRIBUTE MULTI
) ENGINE='rowwise';
-- Ver los índices existentes
SHOW TABLES;
-- Ver la estructura de un índice
DESCRIBE productos;
-- Insertar documentos
INSERT INTO productos (id, nombre, descripcion, categoria, marca, precio, stock, activo)
VALUES (1, 'Camiseta básica algodón', 'Camiseta unisex de algodón 100%', 'Ropa', 'BasicWear', 19.99, 150, 1);
INSERT INTO productos (id, nombre, descripcion, categoria, marca, precio, stock, activo)
VALUES (2, 'Zapatillas deportivas running', 'Zapatillas ligeras para correr', 'Calzado', 'SpeedRun', 89.99, 45, 1);
-- Actualizar un documento
UPDATE productos SET precio = 17.99, stock = 200 WHERE id = 1;
-- Eliminar un documento
DELETE FROM productos WHERE id = 1;
-- Verificar el número de documentos
SELECT COUNT(*) FROM productos;
Integración con MySQL/PostgreSQL
ManticoreSearch puede sincronizar datos desde bases de datos externas usando Plain Indexes:
# Añadir al archivo manticore.conf
# Fuente de datos desde MySQL
source productos_mysql {
type = mysql
sql_host = localhost
sql_user = usuario_db
sql_pass = contraseña_db
sql_db = mi_base_datos
sql_port = 3306
# Consulta principal para obtener los documentos
sql_query = \
SELECT id, nombre, descripcion, categoria, marca, precio, stock, \
UNIX_TIMESTAMP(fecha_alta) AS fecha_alta \
FROM productos \
WHERE activo = 1
# Consulta para obtener los atributos de tipo string
sql_attr_string = categoria
sql_attr_string = marca
sql_attr_float = precio
sql_attr_uint = stock
sql_attr_timestamp = fecha_alta
# Consulta para actualizaciones delta (solo registros nuevos/modificados)
sql_query_range = SELECT MIN(id), MAX(id) FROM productos
sql_range_step = 1000
sql_query_kill = SELECT 1
}
# Definición del índice plain desde la fuente MySQL
index productos_plain {
source = productos_mysql
path = /var/lib/manticore/productos_plain
min_infix_len = 3 # Para búsqueda de subcadenas
}
# Indexar los datos desde MySQL
sudo -u manticore indexer --all --config /etc/manticoresearch/manticore.conf
# Indexar solo un índice específico
sudo -u manticore indexer productos_plain --config /etc/manticoresearch/manticore.conf
# Recargar el índice en el servidor sin reiniciar
sudo -u manticore indexer --rotate productos_plain --config /etc/manticoresearch/manticore.conf
Búsqueda de Texto Completo
-- Búsqueda básica de texto completo
SELECT id, nombre, precio, WEIGHT() AS relevancia
FROM productos
WHERE MATCH('zapatillas running')
ORDER BY relevancia DESC;
-- Búsqueda con filtros adicionales
SELECT id, nombre, categoria, precio
FROM productos
WHERE MATCH('camiseta algodón')
AND categoria = 'Ropa'
AND precio BETWEEN 10 AND 50
AND activo = 1
ORDER BY precio ASC
LIMIT 20 OFFSET 0;
-- Búsqueda con operadores booleanos
SELECT id, nombre
FROM productos
WHERE MATCH('@nombre camiseta | @descripcion camiseta');
-- Búsqueda con proximidad (palabras cercanas)
SELECT id, nombre
FROM productos
WHERE MATCH('"zapatillas running"~5'); -- Las palabras a máximo 5 posiciones de distancia
-- Búsqueda con comodín
SELECT id, nombre
FROM productos
WHERE MATCH('zapati*'); -- Prefijo: zapatilla, zapatillas, zapatillas...
-- Facetas (aggregations)
SELECT categoria, COUNT(*) AS cantidad, AVG(precio) AS precio_medio
FROM productos
WHERE MATCH('ropa')
GROUP BY categoria
ORDER BY cantidad DESC;
-- Facetas múltiples en una sola consulta (más eficiente)
SELECT id, nombre, precio FROM productos WHERE MATCH('sport')
FACET categoria ORDER BY categoria ASC
FACET marca ORDER BY FACET() DESC
FACET precio RANGES 0,50,100,500;
-- Búsqueda con resaltado de términos (highlighting)
SELECT id, nombre,
HIGHLIGHT({before_match='<b>', after_match='</b>'}, 'nombre,descripcion')
FROM productos
WHERE MATCH('zapatillas deportivas');
-- Snippets de texto
SELECT id, nombre,
SNIPPET(descripcion, QUERY(), 'limit=200')
FROM productos
WHERE MATCH('camiseta algodón colores');
Replicación
ManticoreSearch soporta replicación de índices RT entre nodos:
# En el nodo primario y en los nodos secundarios
searchd {
listen = 0.0.0.0:9306:mysql
listen = 0.0.0.0:9308:http
# Puerto para replicación Galera
listen = 0.0.0.0:9315:replication
data_dir = /var/lib/manticore
}
-- En el nodo PRIMARIO: crear el cluster
CREATE CLUSTER mi_cluster 'nodo-primario:9315' as path;
-- Añadir un índice RT al cluster
ALTER CLUSTER mi_cluster ADD productos;
-- En el nodo SECUNDARIO: unirse al cluster
JOIN CLUSTER mi_cluster AT 'nodo-primario:9315';
-- Verificar el estado del cluster
SHOW STATUS LIKE 'cluster%';
# Configuración del firewall para replicación
sudo ufw allow 9315/tcp # Puerto de replicación Galera
sudo ufw allow 9306/tcp # Puerto MySQL
sudo ufw allow 9308/tcp # Puerto HTTP
Solución de Problemas
ManticoreSearch no arranca:
# Revisar logs de inicio
sudo tail -100 /var/log/manticoresearch/searchd.log
# Problemas comunes: permisos en el directorio de datos
ls -la /var/lib/manticore/
sudo chown -R manticore:manticore /var/lib/manticore/
# Verificar la configuración
sudo -u manticore searchd --config /etc/manticoresearch/manticore.conf --test
Error al conectar con cliente MySQL:
# Verificar que ManticoreSearch está escuchando en el puerto MySQL
sudo ss -tlnp | grep 9306
# Probar conexión con mysql
mysql -h 127.0.0.1 -P 9306 -u root --protocol=tcp
# No requiere contraseña por defecto
La indexación desde MySQL falla:
# Verificar la conectividad al servidor MySQL desde ManticoreSearch
mysql -h localhost -u usuario_db -p mi_base_datos -e "SELECT 1"
# Revisar logs de indexación detallados
sudo -u manticore indexer productos_plain \
--config /etc/manticoresearch/manticore.conf \
--verbose 2>&1 | head -50
Búsquedas lentas:
-- Ver el plan de ejecución de una consulta
EXPLAIN SELECT id, nombre FROM productos WHERE MATCH('zapatillas');
-- Revisar las estadísticas del índice
SHOW INDEX STATUS LIKE 'productos';
-- Optimizar el índice RT (consolida chunks)
OPTIMIZE INDEX productos;
El índice crece demasiado:
-- Ver el tamaño del índice
SHOW INDEX STATUS LIKE 'productos';
-- Los índices RT se consolidan automáticamente, pero se puede forzar
OPTIMIZE INDEX productos OPTION cutoff=1;
Conclusión
ManticoreSearch ofrece una combinación única de velocidad, familiaridad con SQL y características avanzadas de búsqueda de texto completo que lo hacen especialmente atractivo para equipos con experiencia en MySQL o Sphinx. Los índices en tiempo real permiten insertar y actualizar documentos sin tiempos de inactividad, mientras que la interfaz SQL reduce la curva de aprendizaje frente a otras soluciones. Para migraciones desde Sphinx, la compatibilidad de configuración y consultas facilita enormemente la transición a este motor moderno y activamente mantenido.


