Encontrar

Article
· Juil 21 3m de lecture

Acelera tus búsquedas de textos con índices %iFind

¡Saludos estimados miembros de la comunidad!

Muchos recordaréis las capacidades NLP disponibles en IRIS con el nombre de iKnow y que fueron deprecadas hará no mucho tiempo. Pero...¿Deprecado todo? ¡NO! Una pequeña aldea resiste a la deprecación, ¡los índices iFind!

Y os preguntaréis, ¿para qué valen estos magníficos índices? Pues muy sencillo, sirven para indexar los textos presentes en las columnas de tipo String y Stream y acelerar dramáticamente la velocidad de consulta sobre las mismas.

¿Qué son los índices %iFind?

Son un tipo de índices basados en mapas de bits, estos índices mapean cada valor único de una columna en una cadena de bits, indicando para cada fila si se dispone de determinado valor. Podéis ver más detalles de estos tipos de índices en la documentación oficial.

Disponemos de 2 tipos de índices en %iFind, el mínimo y el básico, que extiende del anterior.

%iFind.Index.Minimal

Admite búsquedas SQL de palabras y frases con comodines, búsquedas difusas y expresiones regulares. No admite búsquedas por coocurrencia ni por frases posicionales, ni el resaltado de resultados.

%iFind.Index.Basic

Admite todas las funciones del índice mínimo (búsqueda SQL de palabras y frases con comodines) y añade compatibilidad con coocurrencia, búsquedas de frases posicionales y resaltado de resultados. Las funciones de este índice son suficientes para la mayoría de las búsquedas de texto completo habituales.

¿Cómo definir un índice %iFind?

¡No podría ser más sencillo, os lo mostraré con un pequeño ejemplo de un desarrollo que he implementado para leer la información de licitaciones públicas de España:

Class Inquisidor.Object.Licitacion Extends (%Persistent, %XML.Adaptor) [ DdlAllowed ]
{

Property IdLicitacion As %String(MAXLEN = 200);
Property Titulo As %String(MAXLEN = 2000);
...

Index IndexIdLicitation On IdLicitacion [ PrimaryKey ];
Index IndexTitulo On (Titulo) As %iFind.Index.Basic(INDEXOPTION = 0, LANGUAGE = "es");

Como veis tenemos definida la propiedad Título sobre la que queremos hacer búsquedas que me permitan encontrar determinadas licitaciones, un ejemplo de los títulos que vamos a tener será el siguiente:

Servicio de mantenimiento y soporte de la aplicación informática CIVITAS para la gestión de la tarjeta sanitaria individual de la Gerencia Regional de Salud de Castilla y León.

Para definir el índice %iFind utilizaremos la configuración %iFind.Index.Basic(INDEXOPTION = 0, LANGUAGE = "es"), en este caso es un índice básico. Como podéis ver tenemos una serie de propiedades que nos permiten definir cómo queremos que trabaje nuestro índice, veamos las propiedades disponibles:

  • IGNOREPUNCTUATION: admite 2 valores, 0 y 1. Por defecto tendrá el valor 1 e ignorará los signos de puntuación en el texto.
  • INDEXOPTION: también con valores 0 y 1. Permite especificar si el índice permitirá lematización o descomposición de los textos. Debido al gran tamaño que puede requerir sólo se deberá habilitar en caso necesario (valor 1).
  • LANGUAGE: para definir el diccionario que se va a emplear en las búsquedas, en nuestro ejemplo, español.
  • LOWER: con valores 0 ó 1. Permitirá indicar si el índice será sensible a mayúsculas y minúsculas, por defecto tendrá el valor 0, ignorándolo.
  • USERDICTIONARY: para que el índice haga uso de un diccionario del usuario previamente a la indexación.

¿Cómo usar el índice %iFind en una consulta?

Para hacer uso de este tipo de índices deberemos usar la siguiente notación:

SELECT * FROM Inquisidor_Object.Licitacion WHERE %ID %FIND search_index(IndexTitulo, ?)

Veamos el índice en acción. En mi ejemplo tengo una tabla con 800.000 registros de licitaciones públicas. Veamos el plan con el tradicional LIKE sobre nuestra tabla:

Ahora veamos el plan usando el índice:

Como podéis ver el coste relativo entre la búsqueda normal y la búsqueda con el índice %iFind es astronómico: 1239110280 para la consulta sin índice por 8323422 para la consulta indexada, siendo 150 veces más rápida.

Si queréis ver en más detalle el tipo de búsquedas que permiten los índices %iFind aquí tenéis la documentación asociada.

¡Espero que os sea de utilidad!

1 Comment
Discussion (1)1
Connectez-vous ou inscrivez-vous pour continuer
Question
· Juil 21

Activate a mirror database gives "protected" error

Hi,

I have a mirrored database called ROUTER.

I have a primary server T1 and a "Disaster Recovery" server T2.

When I activate ROUTER database on T2, I get the error it says the "Database could not be mounted".

I went to the audit database and it shows "Attempt to access a protected database".

T2 in mirror monintor shows "Connected" "Caught up" "Warning! Some databases need attention"

T2 show the ROUTER database as being "Mounted/R"

Both T1 & T2 are Linux servers. The ROUTER database file IRIS.DAT have the same Linux permissions

All productions on T1/T2 are not running.

What causes the error "Attempt to access a protected database"?

3 Comments
Discussion (3)3
Connectez-vous ou inscrivez-vous pour continuer
Question
· Juil 20

Login error

Hi Guys, 

I've my users set in Security->Users in SMP, but I get the below error when trying to long in my application, any clues what this error means?  

"0 "_$lb($lb(864,,,,,,,,,$lb(,"US-SERENITY",$lb("e^UsersCSPLogin+87^%SYS.SECURITY^1","e^CSPLogin+103^%SYS.cspServer^1","e^CSPDispatch+909^%SYS.cspServer^1","d^CSPDispatch+907^%SYS.cspServer^1","d^ProcessRequest+1^%CSP.Session.1^1","d^Request+692^%SYS.cspServer2^1","d^Request+25^%SYS.cspServer2^1","d^ProcessRequest+1^%CSP.Request.1^1","d^css+15^%SYS.cspServer2^1","d^Server+64^%SYS.SERVER^2","d^^^0"))))

BTW my login page extends  %CSP.Login

Thanks

4 Comments
Discussion (4)3
Connectez-vous ou inscrivez-vous pour continuer
Article
· Juil 20 1m de lecture

Comment supprimer votre compte de la Communauté de développeurs

Bonjour la Communauté,

Si vous avez décidé de quitter la communauté des développeurs InterSystems, nous sommes désolés ! Ce guide vous guidera pas à pas pour supprimer définitivement votre compte.

⚠️ Avant de commencer : veuillez noter que la suppression de votre compte est irréversible. Si vous souhaitez simplement ne plus recevoir de notifications, pensez à mettre à jour vos paramètres de notification.

Comment demander la suppression d'un compte :

1. Connectez-vous à la Communauté des développeurs.
2. Cliquez sur votre photo de profil en haut à droite et accédez à l'onglet « Paramètres du profil ».
3. Faites défiler la page jusqu'en bas et cliquez sur « Demander la suppression du compte ».

4. Dans la fenêtre contextuelle, cliquez sur « Oui, supprimer mon compte » pour confirmer.

 

Une fois votre demande reçue, notre équipe la traitera et vous informera lorsque la suppression sera terminée.

Si nous pouvons améliorer votre expérience ou si vous avez des commentaires à partager avant de quitter, n'hésitez pas à nous contacter.


💬 Besoin d'aide ? Si vous ne parvenez pas à supprimer votre compte ou si vous avez des questions, n'hésitez pas à contacter notre équipe par message privé sur la Communauté.

Discussion (0)1
Connectez-vous ou inscrivez-vous pour continuer