Sphinx – Estrategia Orfeo NG

Descripción

La estrategia de NG es la misma de Sphinx – Estrategia Orfeo 6  y se define como: dos indices

1. principal incremental que le hago merge cuando termino
2. Uno transaccional con los del dia

Se tiene dos tablas en la BD para guardar las fechas del ultimo indexada y de los que se borran o actualizan para removerlos del indice.

Prerequistos

Tenemos un equipo corriendo Orfeo NG y vamos a agregar

Configuración

1. Instalación

Se requieren tres tablas para guardar la información de FTS   (Incluidas ya dentro del modelo estándar)

– ocrDatos                                     # Datos de texto de un documento
– ocrSphinxIndexMeta                  # Se usa para dejar una marca de tiempo cada vez que se ejecuta el proceso de indexación
– ocrSphinxIndexRemove             # Se usa para indicarle a sphinx que registros debe eliminar, orfeo carga datos en esta tabla
cuando actualizan un anexo cargado con skinascan

2. Configuración

2.1  La fuente de datos  ( De donde sale los textos)

Se coloca la base de datos de Orfeo como fuente «src_orfeo_ocr»

type       = MySQL – MariaDB
sql_host   = 127.0.0.1
sql_user   = orfeoNGusr
sql_pass   = zzzz
sql_db     = orfeoNGdb
sql_port   = 3306

Se indica la totalidad de los registros por query para no traerlos todos de una. Se supone indice continuo y consecutivo

sql_query_range = SELECT MIN(idOcrDatos),MAX(idOcrDatos) FROM datosocr
sql_range_step  = 2000

El query para capturar los datos. La primera columna siempre es indice asi no se indique

sql_query = SELECT \
idOcrDatos as «indice»,\
idDocumentoOcrDatos as «id_radicado»,\
tablaAfectadaOcrDatos as «tabla_afectada»,\
textoExtraidoOcrDatos as «ocr»,\
creacionOcrDatos as «fecha_ocr»\
FROM ocrDatos \
WHERE ocrDatos.indice \
BETWEEN $start AND $end

Cada vez que se indexa la totalidad de los registros, después de ejecutarse el proceso, se mueve la marca de tiempo que indica al indice indice_ocr desde donde va a consultar los registros

sql_query_post_index =  \
UPDATE ocrSphinxIndexMeta \
SET fechaActualizaOcrSphinxIndexMeta = now() \
WHERE nombreOcrSphinxIndexMeta = ‘sph_idx_posts_main’;

Ahora los campos de indexación

#- Indexador toma la primera columa como id unico
sql_field_string   = id_radicado
sql_field_string   = tabla_afectada
sql_field_string   = ocr
sql_attr_timestamp = fecha_ocr

Se define una segunda fuente de datos, para las actualizaciones

Indice para solo consultar los registros que están después de una marca de  tiempo guardada en una tabla independiente, este indice hereda propiedades del indice orfeo_ocr. Este indice se usa para hacer merge de solo los datos que han sido cargados después de la ultima indexación

source src_indice_ocr : src_orfeo_ocr
{
sql_query = SELECT \
idOcrDatos as «indice»,\
idDocumentoOcrDatos as «id_radicado»,\
tablaAfectadaOcrDatos as «tabla_afectada»,\
textoExtraidoOcrDatos as «ocr»,\
creacionOcrDatos as «fecha_ocr»\
FROM ocrDatos WHERE ocrDatos.creacionOcrDatos >= \
(SELECT fechaActualizaOcrSphinxIndexMeta \
FROM ocrSphinxIndexMeta m \
WHERE m.nombreOcrSphinxIndexMeta = ‘sph_idx_posts_main’ ) \
AND ocrDatos.indice BETWEEN $start AND $end

La lista de los borrados o alterados para quitarlos del indice

sql_query_killlist = SELECT indice FROM sphinx_index_remove where estado = 1;

Cada vez que se indexa la totalidad de los registros, despues de ejecutarse el proceso, se mueve la marca de tiempo que indica al indice indice_ocr desde donde va a consultar los registros Y limpia el indice de borrados y actualizados

sql_query_post_index =  UPDATE ocrSphinxIndexMeta \
SET fechaActualizaOcrSphinxIndexMeta=now() \
WHERE nombreOcrSphinxIndexMeta=’sph_idx_posts_main’;

sql_query_post =  UPDATE ocrSphinxIndexRemove \
SET estadoOcrSphinxIndexRemove=0,ejecucionOcrSphinxIndexRemove=now() \
WHERE estadoOcrSphinxIndexRemove=10;

$**** la separación en dos queries es porque no acepta una sola larga .. la trunca y la BD falla .. .. entonces toco arriesgarse.

#- Indexador toma la primera columa como id unico
sql_field_string   = id_radicado
sql_field_string   = tabla_afectada
sql_field_string   = ocr
sql_attr_timestamp = fecha_ocr
}

2.2  El Indice  (Donde guarda la información obtenida de la fuente para la búsqueda)

Los indices son  .. el primero de almacenamiento y el segundo de los deltas para adicionar al global.

index indice_ocr
{
source                  = src_indice_ocr
path                    = /var/lib/sphinxsearch/indice/indice_ocr
}

index orfeo_ocr
{
source                  = src_orfeo_ocr
path                    = /var/lib/sphinxsearch/dataorfeo/orfeo_ocr
min_word_len            = 3
}

$** Recuerde que en centos el directorio es /var/lib/sphinx

Ya con estos cambios  tiene listo su Sphinx Search para realizar indexación.

Operación

De aquí adelante el proceso no cambia .. es idéntico a la estrategia de Orfeo 6 

1. Indexación

Para arrancar los indices se hace

/usr/bin/indexer –rotate –config /etc/sphinxsearch/sphinx.conf –all

2. Búsqueda

La función de búsqueda se hace por medio de un servicio (demonio) corriendo llamado searchd. El archivo de configuración también tiene aparte

searchd
{
listen                        = 9312
listen                        = 9306:mysql41
log                             = /var/log/sphinxsearch/searchd.log
query_log                 = /var/log/sphinxsearch/query.log
read_timeout            = 5
max_children            = 30
pid_file                      = /var/run/sphinxsearch/searchd.pid
seamless_rotate         = 1
preopen_indexes         = 1
unlink_old                  = 1
workers                    = threads # for RT to work
binlog_path              = /var/lib/sphinxsearch/
}

#** Recuerde que en debian los directorios se llaman sphinxsearch

Y pues debe estar corriendo ..

Para usar PHP ..se puede usar el API de sphinx  .. que viene con el paquete .. pero como siempre es mejor usar el del sistema

3. Indexación automática

Para la indexación automática se deberá crear una tarea en el cron del sistema, este cron lo ajustaremos a 10 minutos.

$#Ejecuta la indexacion de sphinx actualizando los resultados del modulo Full Tex Search PARA EL DEMO ESTA CADA MINUTO
$#*/1 * * * * root /usr/bin/indexer –rotate –config /etc/sphinx/sphinx.conf –all

$#Indexacion incremental se debe ejecutar con un delta de tiempo
10 * * * * root /usr/bin/indexer –config /etc/sphinxsearch/sphinx.conf indice_ocr –rotate
11 * * * * root /usr/bin/indexer –config /etc/sphinxsearch/sphinx.conf –merge orfeo_ocr  indice_ocr –rotate
Aquí toca evaluar cuantos documentos tiene y que estrategia tiene para mantener el indice.

 

4. Extracción de Texto

Esto no es necesario en NG .. pero lo dejamos armado por que de pronto va a ser necesario.

El proceso de extracción se hace asincrónico con un script que corre cada determinado tiempo, sacando el texto e insertándolo en la tabla

La extracción sigue la directivas de  este wiki  Extraccion de texto de documentos

Y el cron para que lo ejecute

15 */6 * * * root /usr/local/skina/bin/llene_campos_texto &> /dev/null

 

Trucos

 

Problemas

1. El string de sql_post_index no puede ser largo

– Me saca error en MySQL – MariaDB si junto los dos.

Referencias

 

FIN


Advertencia

Este documento es privado y es de u so exclusivo de sus autores y de SKINA TECH. Cualquier uso sin una autorización escrita es contra la ley de derechos de autor y de propiedad intelectual, y será motivo de una acción legal.


ANEXOS   (en MySQL – MariaDB)

—————  datos ocr ————————
— ——————————————————————————————————————————————————————–
— Estructura de tabla para la tabla `ocrDatos`

CREATE TABLE `ocrDatos` (
`idOcrDatos` int(11) NOT NULL,
`idDocumentoOcrDatos` int(11) NOT NULL COMMENT ‘id registro del documento segun la tabla’,
`tablaAfectadaOcrDatos` int(11) NOT NULL COMMENT ‘1:radiDocumentos, 2:radiDocumentosPrincipales, 3:gdExpedienteDocumentos’,
`textoExtraidoOcrDatos` text NOT NULL COMMENT ‘contenido del documento’,
`creacionOcrDatos` datetime NOT NULL DEFAULT current_timestamp() COMMENT ‘creación registro’,
`estadoOcrDatos` int(11) NOT NULL DEFAULT 10 COMMENT ‘estado estandar’
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=’Guarda directamente todo el texto que se extrae de los docum’;

— ——————————————————————————————————————————————————————–
— Estructura de tabla para la tabla `ocrSphinxIndexMeta`

CREATE TABLE `ocrSphinxIndexMeta` (
`idOcrSphinxIndexMeta` int(11) NOT NULL,
`nombreOcrSphinxIndexMeta` text NOT NULL,
`idMaxOcrSphinxIndexMeta` int(11) NOT NULL,
`fechaActualizaOcrSphinxIndexMeta` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=’Marca de tiempo cada vez que se ejecuta el proceso de indeza’;

INSERT INTO `ocrSphinxIndexMeta` (`idOcrSphinxIndexMeta`, `nombreOcrSphinxIndexMeta`, `idMaxOcrSphinxIndexMeta`, `fechaActualizaOcrSphinxIndexMeta`) VALUES
(1, ‘sph_idx_posts_main’, 1, ‘2020-08-11 11:10:01’);

— ——————————————————————————————————————————————————————–
— Estructura de tabla para la tabla `ocrSphinxIndexRemove`

CREATE TABLE `ocrSphinxIndexRemove` (
`idOcrSphinxIndexRemove` int(11) NOT NULL,
`indiceOcrSphinxIndexRemove` int(11) NOT NULL,
`estadoOcrSphinxIndexRemove` int(11) NOT NULL DEFAULT 10 COMMENT ‘estado estandar’,
`creacionOcrSphinxIndexRemove` datetime NOT NULL DEFAULT current_timestamp() COMMENT ‘fecha de creacion’,
`ejecucionOcrSphinxIndexRemove` int(11) NOT NULL,
`identiOcrSphinxIndexRemove` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=’sphinx_index_remove se usa para indicarle a sphinx que regis’;

— ——————————————————————————————————————————————————————–
— Indices de tablas

ALTER TABLE `ocrDatos` ADD PRIMARY KEY (`idOcrDatos`);
ALTER TABLE `ocrSphinxIndexMeta` ADD PRIMARY KEY (`idOcrSphinxIndexMeta`);
ALTER TABLE `ocrSphinxIndexRemove` ADD PRIMARY KEY (`idOcrSphinxIndexRemove`);

— ——————————————————————————————————————————————————————–
— AUTO_INCREMENT de tablas

ALTER TABLE `ocrDatos` MODIFY `idOcrDatos` int(11) NOT NULL AUTO_INCREMENT;
ALTER TABLE `ocrSphinxIndexMeta` MODIFY `idOcrSphinxIndexMeta` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;
ALTER TABLE `ocrSphinxIndexRemove` MODIFY `idOcrSphinxIndexRemove` int(11) NOT NULL AUTO_INCREMENT;

==============================================================

15-Septiembre-2020 J.E.Gomez v1.0 Primera version