Sphinx – Estrategia Orfeo 6

Descripción

La estrategia se define como: dos indices

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

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

Prerequistos

Tenemos un equipo corriendo Orfeo y vamos a agregar sphinx

Los fuentes estan en un proyecto llamado busquedaOCR en el gforge de skina  http://monserrat.skinatech.com:81/gf/project/busquedaocr/

Configuración

1. Instalación

Se van  a tener tres tablas adicionales a las originales de Orfeo para guardar la informacion de FTS

– datosocr                                     # Datos de texto de un documento
– sphinx_index_meta                    # Se usa para dejar una marca de tiempo cada vez que se ejecuta el proceso de indexación
– sphinx_index_remove                # 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                    = pgsql
sql_host              = 127.0.0.1
sql_user              = demo_usr
sql_pass             = jo6hait@eez
sql_db                = demo_odb
sql_port              = 5432

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(indice),MAX(indice) FROM datosocr
sql_range_step  = 100000

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

sql_query = \
SELECT \
indice as «indice»,\
nume_radi as «id_radicado»,\
nume_radi as «numero_radicado»,\
texto as «ocr»,\
radi_nume_deri as «radi_nume_deri»,\
fecha_radi as «fecha_radi»,\
tipo as «tipo»,\
radi_depe_radi as «radi_depe_radi»,\
tipo_radi as «tipo_radi»,\
anex_desc as «anex_desc» \
FROM datosocr WHERE datosocr.indice BETWEEN $start AND $end

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

sql_query_post_index =  \
UPDATE sphinx_index_meta \
SET last_update = now()  \
WHERE index_name = ‘sph_idx_posts_main’;

Ahora los campos de indexación

# sql_field_string = id_radicado
sql_field_string = numero_radicado
sql_field_string = ocr
sql_field_string = radi_nume_deri
sql_field_string = fecha_radi
sql_field_string = tipo
sql_field_string = radi_depe_radi
sql_field_string = tipo_radi
sql_field_string = anex_desc

Se define una segunda fuente de datos, para las actualizaciones

Indice para solo consultar los registros que estan despues 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 despues de la ultima indexacion

source src_indice_ocr : src_orfeo_ocr
{
sql_query = \
SELECT \
indice as «indice»,\
nume_radi as «id_radicado»,\
nume_radi as «numero_radicado»,\
texto as «ocr»,\
radi_nume_deri as «radi_nume_deri»,\
fecha_radi as «fecha_radi»,\
tipo as «tipo»,\
radi_depe_radi as «radi_depe_radi»,\
tipo_radi as «tipo_radi»,\
anex_desc as «anex_desc» \
FROM datosocr WHERE datosocr.fechaocr >= \
(SELECT last_update FROM sphinx_index_meta m WHERE m.index_name = ‘sph_idx_posts_main’ ) \
AND datosocr.indice BETWEEN $start AND $end

Leo los indices para borrar de la tabla de remove

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

sql_query_post_index =   \
UPDATE sphinx_index_remove \
SET estado = 0, fecha_ejecucion = now() \
WHERE estado = 1; \
UPDATE sphinx_index_meta \
SET last_update = now()  \
WHERE index_name = ‘sph_idx_posts_main’; \

sql_field_string = numero_radicado
sql_field_string = ocr
sql_field_string = radi_nume_deri
sql_field_string = fecha_radi
sql_field_string = tipo
sql_field_string = radi_depe_radi
sql_field_string = tipo_radi
sql_field_string = anex_desc

}

2.2  El Indice  (Donde guarda la informacion 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/sphinx/dataorfeo/indice_ocr
}

index orfeo_ocr2
{

source                = src_orfeo_ocr
path                    = /var/lib/sphinx/dataorfeo/orfeo_ocr
docinfo               = extern
dict                     = keywords
morphology        = none
min_word_len        = 3
}

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

Operacion

1. Indexación

Para arrancar los indices se hace

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

2. Busqueda

La funcion de busqueda se hace por medio de un servicio (demonio) corriendo llamado searchd. El archivo de configuracion tambien 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/
}

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 automatica

Para la indexación automatica se debera 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/sphinx/sphinx.conf indice_ocr –rotate
11 * * * * root /usr/bin/indexer –config /etc/sphinx/sphinx.conf –merge orfeo_ocr  indice_ocr –rotate
Aqui toca evaluar cuantos documentos tiene y que estrategia tiene para mantener el indice.

 

4. Extracción de Texto

El proceso de extraccion se hace asincronico con un script que corre cada determinado tiempo, sacando el texto e insertándolo en la tabla

La extraccion 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

3: Uso radi_nume_radi dos veces en el query, esto con el fin que el primer resultado lo use como indice, RECUERDE EL PRIMER CAMPO DEL QUERY ES EL INDICE DE SPHINX SEARCH.

Problemas

 

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

—————  datos ocr ————————
datosocr es donde se guarda directamente todo lo que skinascan reconoce como texto

CREATE TABLE datosocr (
indice integer NOT NULL,
nume_radi character varying(30) NOT NULL,
texto text NOT NULL,
radi_nume_deri character varying(30),
fecha_radi timestamp with time zone NOT NULL,
tipo numeric(2,0) NOT NULL,
radi_depe_radi character varying(5) NOT NULL,
tipo_radi numeric(2,0) NOT NULL,
tdoc_codi numeric(4,0) NOT NULL,
anex_desc character varying(3000),
fechaocr timestamp with time zone DEFAULT now() NOT NULL
);

CREATE SEQUENCE datosocr_indice_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;

ALTER SEQUENCE datosocr_indice_seq OWNED BY datosocr.indice;
ALTER TABLE ONLY datosocr ALTER COLUMN indice SET DEFAULT nextval(‘datosocr_indice_seq’::regclass);
ALTER TABLE ONLY datosocr
ADD CONSTRAINT datosocr_pkey PRIMARY KEY (indice);

—————  sphinx index meta ————————
sphinx_index_meta esta tabla se usa para dejar una marca de tiempo cada vez que se ejecuta el proceso de indexación

CREATE TABLE sphinx_index_meta (
index_name character varying(50) NOT NULL,
max_id integer NOT NULL,
last_update timestamp with time zone NOT NULL
);

INSERT INTO sphinx_index_meta VALUES (‘sph_idx_posts_main’, 1, ‘2019-01-16 10:49:01.961098-05’);

—————  sphinx index remove ————————
sphinx_index_remove se usa para indicarle a sphinx que registros debe eliminar, orfeo carga datos en esta tabla cuando actualizan un anexo cargado con skinascan

CREATE TABLE sphinx_index_remove (
id integer NOT NULL,
indice integer NOT NULL,
estado numeric(1,0) NOT NULL,
fecha_creacion timestamp with time zone NOT NULL,
fecha_ejecucion timestamp with time zone,
identificador character varying(30) NOT NULL
);

CREATE SEQUENCE sphinx_index_meta_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;

ALTER SEQUENCE sphinx_index_meta_id_seq OWNED BY sphinx_index_remove.id;
ALTER TABLE ONLY sphinx_index_remove ALTER COLUMN id SET DEFAULT nextval(‘sphinx_index_meta_id_seq’::regclass);
ALTER TABLE ONLY sphinx_index_remove
ADD CONSTRAINT sphinx_index_meta_pkey PRIMARY KEY (id);

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

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