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.