Red de conocimiento del abogados - Cuestiones jurídicas del divorcio - Cómo hacer un mejor uso de la búsqueda de texto completo de Oracle

Cómo hacer un mejor uso de la búsqueda de texto completo de Oracle

Hay muchas formas de buscar texto en una base de datos Oracle sin utilizar la función de texto de Oracle. Esto se puede lograr utilizando la función INSTR estándar y el operador LIKE.

SELECT * FROM mi texto WHERE INSTR(the text,'Oracle')>0;

SELECT * FROM mytext, donde el texto es similar a "% Oracle %";

En muchos casos, usar instr y like es ideal, especialmente cuando la búsqueda abarca solo una tabla pequeña. Sin embargo, estos métodos de posicionamiento de texto darán lugar a escaneos completos de tablas, que consumen recursos y tienen funciones de búsqueda muy limitadas. Por lo tanto, al buscar datos de texto masivos, se recomienda utilizar la función de búsqueda de texto completo proporcionada por oralce para establecer una búsqueda de texto completo. Paso 1: verificar y configurar roles de base de datos. Primero, verifique si hay un usuario CTXSYS y una piedra angular CTXAPP en la base de datos. Si no existe tal usuario ni rol, significa que las funciones intermedias no se instalaron cuando se creó la base de datos. Debe modificar la base de datos para instalar esta característica. De forma predeterminada, el usuario ctxsys está bloqueado, por lo que debe habilitarse primero. Paso 2: Otorgue el permiso de ejecución de ctx_ddl bajo el usuario ctxsys al usuario que desea usar el índice de texto completo, por ejemplo:

Otorgue ejecución en ctx_ddl a pomoho

Paso 3: Configurar el análisis léxico Lexer

Oracle implementa la recuperación de texto completo y su mecanismo es realmente muy simple. Es decir, utilizar el lexer patentado de Oracle (lexer) para descubrir todas las unidades ideográficas del artículo (Oracle las llama $term) y registrarlas en un conjunto de tablas que comienzan con dr$, y también registrar la posición, frecuencia y ubicación del valor hash de $term y otra información. Al realizar la búsqueda, Oracle busca el término $ correspondiente en este conjunto de tablas, calcula su frecuencia de aparición y calcula una puntuación para cada documento basándose en un algoritmo, que se denomina "tasa de coincidencia". Lexer es el núcleo de este mecanismo y determina la eficiencia de la recuperación de texto completo. Oracle proporciona diferentes lexers para diferentes idiomas y normalmente podemos usar tres de ellos:

N basic_lexer: para inglés. Puede separar palabras en inglés de oraciones basándose en espacios y signos de puntuación, y también puede tratar automáticamente algunas palabras que aparecen con demasiada frecuencia y han perdido su significado de recuperación como "basura", como if, is, etc. , alta eficiencia de procesamiento. Sin embargo, existen muchos problemas con el uso de esta palabra en chino. Debido a que solo reconoce espacios y puntuación, y generalmente no hay espacios en las oraciones chinas, tratará la oración completa como un término $ y, de hecho, perderá sus capacidades de recuperación. Tomemos como ejemplo la frase "El pueblo chino se ha puesto de pie". El resultado del análisis de basic_lexer es solo un término $, que es "El pueblo chino se puso de pie". Si busca "China" en este momento, no podrá recuperar contenido relevante.

N Chinese_vgram_lexer: analizador chino dedicado que admite todos los conjuntos de caracteres chinos (ZHS 16 GB 231280 zhs 16 gbk zht 32 euchzht 16 big 5 zht 32 triszht 16 ms win 950 zht 16 hkk). El analizador analiza oraciones chinas en unidades de palabras. La frase "El pueblo chino se ha puesto de pie" será analizada como: "China", "pueblo chino", "pueblo chino", "pueblo", "el pueblo se ha puesto de pie", "levántate", "ven". ", "Próximo". Se puede ver que el algoritmo de implementación de este método de análisis es muy simple y puede lograr "captarlos a todos", pero la eficiencia no es satisfactoria.

N Chinese_lexer: este es un nuevo analizador chino que solo admite el juego de caracteres utf8. Como vimos anteriormente, el analizador chino vgram lexer es muy mecánico ya que no reconoce palabras chinas comunes. Por ejemplo, las palabras "人 stand" y "stand up" anteriores nunca aparecerán solas en chino, por lo que este término $ no tiene sentido y afectará la eficiencia. La mayor mejora de Chinese_lexer es que el analizador puede comprender las palabras chinas más utilizadas, por lo que las oraciones se pueden analizar de manera más eficiente. Las dos estúpidas unidades anteriores ya no aparecerán, lo que mejorará enormemente la eficiencia. Pero sólo es compatible con utf8. Si su base de datos tiene el juego de caracteres zhs16gbk, entonces solo puede usar el estúpido vgram lexer chino.

Si no se realizan configuraciones, Oracle usa el analizador basic_lexer de forma predeterminada. Para especificar qué lexer usar, haga esto:

Primero, cree una preferencia bajo el usuario actual (por ejemplo, ejecute la siguiente instrucción bajo el usuario pomoho).

exec CTX_DDL.create_preference('my_lexer','Chinese_vgram_lexer');

En segundo lugar, al establecer el índice de texto completo, especifique el analizador léxico:

Cree un índice myindex en mytable (mycolumn). El tipo de índice es ctxsys.context

Parámetro (' lexer my _ lexer ');

El índice de texto completo creado de esta manera. utilizará Chinese_vgram_lexer como analizador.

Paso 4: Crear índice.

Utilice la siguiente sintaxis para crear un índice de texto completo

Crear índice [schema. ] índice de esquema. ] El tipo de índice de la tabla (columna) es ctxsys.context [ONLINE]

LOCAL[(PARTITION[PARTITION][PARAMETERS(' paramstring ')]

[, PARTITION[PARTITION] [ PARAMETERS(' paramstring ')]]]]

[PARAMETERS(paramstring)][PARALLEL n][INUSABLE];

Ejemplo:

En pubmenu Crear índice CTX _ idx _ menuname (menuname)

indextype es el parámetro ctxsys.context (' lexer my_lexer ')

Usar índice

Usar texto completo El índice es muy simple y se puede lograr de las siguientes maneras:

seleccione * del menú del pub donde contiene (menú, 'Subir imágenes')> 0

El tipo de texto completo índice

El índice de Oracle Text ya creado se denomina índice de dominio e incluye cuatro tipos de índice:

lContext

2 CTXCAT

3 CTXRULE

4 CTXXPATH

Dependiendo de su aplicación y del tipo de datos de texto, puede elegir cualquiera

Crear un índice de texto completo para múltiples campos

Muchas veces, necesita consultar registros que cumplan con los requisitos de múltiples campos de texto. En este momento, debe establecer un índice de texto completo para múltiples campos. Para recuperar el texto del nombre del sujeto y la breve introducción de pmhsubjects, debe realizar los siguientes pasos:

Se recomienda preferir el índice de campos múltiples

Inicie sesión como ctxsys y ejecute:

EXEC CTX_DDL. create_preference('CTX_idx_subject_pref',

Almacenamiento de datos de varias columnas');

Crea valores de campo correspondientes a las preferencias (inicie sesión como ctxsys)

EXEC CTX _ DDL . set _ atributo ('CTX_idx_subject_pref','columns','subjectname,breve intro');

Crear índice de texto completo

Cree el índice ctx_idx_subject en pmhsubjects(subjectname)

INDEXTYPE ISctxsys. Parámetros de contexto ('datastoreCTX sys . CTX _ idx _ sujeto _ pref lexer my _ lexer ')

Usar índice

seleccione * de pmh sujetos donde contiene (nombre del sujeto, " Li Yuchun ”)> 0

Mantenimiento del índice de texto completo

Para CTXSYS. Índice de contexto: después de que la aplicación realiza operaciones DML en la tabla base, es necesario mantener el índice de la tabla base. El mantenimiento del índice incluye la sincronización y la optimización del índice.

Después de crear el índice, podemos encontrar que Oracle generó automáticamente la siguiente tabla bajo este usuario: (asumiendo que el nombre del índice es myindex):

$myindex$Dr.I, $myindex$ Dr. K, Dr. $myindex$R, Dr. $myindex$N, entre los cuales la Tabla I es la más importante.

Puede mirar la tabla para ver lo que contiene:

SELECT token_text, token_count FROM dr$I_rsk1$Iwhere ROWNUM & lt= 20;

Aquí está No más consultas de enumeración. Lo tomé. Como puede ver, lo que se guarda en esta tabla es en realidad el registro $term generado por Oracle después de analizar su documento, incluida la posición, la frecuencia y el valor hash del $term. Cuando el contenido del documento cambia, es concebible que el contenido de la tabla I también cambie en consecuencia para garantizar que Oracle pueda recuperar correctamente el contenido al realizar la recuperación de texto completo (porque la llamada recuperación de texto completo en realidad consulta esto núcleo de la mesa). Esto utiliza sincronización (sincronización) y optimización (optimización).

Sincronización: guarde el nuevo término $ en la tabla I;

Optimización: borre la basura de la tabla I, principalmente eliminando el término $ eliminado en la tabla I.

Cuando se inserta, actualiza o elimina un documento indexado en la tabla base, los cambios en la tabla base no afectan inmediatamente al índice hasta que se sincroniza. Puede consultar la vista CTX_User_Pending para ver los cambios correspondientes. Por ejemplo:

SELECT pnd_index_name, pnd_rowid,

TO_CHAR(PND_Timestamp, 'dd-mon-yyyy hh24:mi:ss') marca de tiempo

De ctx_user_pending

El resultado de esta declaración es similar al siguiente:

Nombre de índice PND Marca de tiempo PND ROWID

- - -

MYINDEX aaadxnaabaaas 3 saac 06-oct-1999 15:56:50

Métodos de sincronización y optimización: puede utilizar el paquete ctx_ddl proporcionado por Oracle para sincronizar y optimizar el índice.

1. Para los índices de tipo CTXCAT, Oracle mantendrá automáticamente el índice al realizar operaciones DML en la tabla base. Los cambios en los documentos se reflejan inmediatamente en el índice. CTXCAT es un índice de formas de transacciones.

Sincronización de índices

Sincronizar índices después de insertar, modificar y eliminar tablas base. Se recomienda utilizar sincronización para sincronizar el índice. Sintaxis:

ctx_ddl.sync_index(

El idx_name en VARCHAR2 está vacío por defecto

La memoria en VARCHAR2 está vacía por defecto,

part_name en VARCHAR2 está vacío de forma predeterminada

parallel_grade IN NUMBER tiene como valor predeterminado 1);

Nombre de índice de nombre Idx

Memoria especifica la memoria necesaria para sincronizar el índice . El valor predeterminado es el parámetro del sistema DEFAULT_INDEX_MEMORY.

Especificar una gran cantidad de memoria puede acelerar la eficiencia de la indexación y la velocidad de las consultas, y reducir la fragmentación del índice.

Part_name Qué índice de partición está sincronizado.

Índice de sincronización paralela de paralelismo. Establecer paralelismo.

Por ejemplo:

Sincronizar índice myindex:exectx _ DDL sync _ index(' myindex ');

Sugerencias de implementación: Se recomienda sincronizar el archivo. indexar a través del trabajo de Oracle.

Optimización del índice

La sincronización frecuente del índice puede provocar una fragmentación del índice contextual. La fragmentación del índice afecta seriamente la velocidad de respuesta a las consultas. Los índices se pueden optimizar periódicamente para reducir la fragmentación, reducir el tamaño del índice y mejorar la eficiencia de las consultas.

Cuando se elimina texto de una tabla, Oracle Text marca el documento eliminado pero no modifica inmediatamente el índice. Por lo tanto, la información del documento existente ocupa espacio innecesario, lo que genera costos de consulta adicionales. Debe optimizar el índice en modo completo y eliminar la información antigua no válida del índice. Este proceso se llama eliminación de basura. La eliminación de basura es necesaria cuando actualiza y elimina con frecuencia datos de texto de tablas.

exec CTX_DDL. optimiza_index('myidx','full');

Sugerencia: Optimice el índice de texto completo todos los días cuando el sistema esté inactivo para mejorar la eficiencia de la recuperación.