Para comprender el concepto de búsqueda de texto completo, debe recordar el conocimiento de búsqueda de patrones a través de la palabra clave LIKE. Entonces, supongamos una tabla 'persona' en la base de datos 'prueba' con los siguientes registros en ella.
>> SELECCIONAR * DE la persona;
Supongamos que desea obtener los registros de esta tabla, donde la columna 'nombre' tiene un carácter 'i' en cualquiera de sus valores. Pruebe la siguiente consulta SELECT mientras usa la cláusula LIKE en el shell de comandos. En el resultado a continuación, puede ver que solo tenemos 5 registros para este carácter en particular 'i' en la columna 'nombre'.
>> SELECCIONAR * DE la persona DONDE nombre COMO '% i%';
Uso de Tvsector:
A veces no sirve de nada usar la palabra clave LIKE para hacer una búsqueda rápida de patrones, aunque la palabra está ahí. Tal vez esté considerando usar expresiones estándar, y aunque esta es una alternativa factible, las expresiones regulares son fuertes y lentas. Tener un vector de procedimiento para palabras completas en un texto, una descripción vernácula de esas palabras, es una forma mucho más eficiente de abordar este problema. El concepto de búsqueda de texto completo y el tipo de datos tsvector fue creado para responder a él. Hay dos métodos en PostgreSQL que hacen exactamente lo que queremos:
- To_tvsector: Se usa para hacer una lista de tokens (ts significa "búsqueda de texto").
- To_tsquery: Se utiliza para buscar en el vector la incidencia de términos o frases específicos.
Ejemplo 01:
Comencemos con una ilustración simple de la creación de un vector. Suponga que desea hacer un vector para la cuerda: "Algunas personas tienen el cabello castaño rizado con un cepillado adecuado.". Por lo tanto, debe escribir una función to_tvsector () junto con esta oración entre paréntesis de una consulta SELECT como se adjunta a continuación. En el resultado a continuación, puede ver que produciría un vector de referencias (posiciones de archivo) para cada token, y también donde los términos con poco contexto, como artículos (el) y conjunciones (y, o), se ignoran deliberadamente.
>> SELECT to_tsvector ('Algunas personas tienen el pelo castaño rizado si se cepillan adecuadamente');
Ejemplo 02:
Suponga que tiene dos documentos con algunos datos en ambos. Para almacenar estos datos, ahora usaremos un ejemplo real de generación de tokens. Suponga que ha creado una tabla 'Datos' en la 'prueba' de su base de datos con algunas columnas utilizando la siguiente consulta CREAR TABLA. No olvide crear una columna de tipo TVSECTOR llamada 'token' en ella. De la salida a continuación, puede echar un vistazo a la tabla que se ha creado.
>> CREAR TABLA Datos (Id. SERIAL PRIMARY KEY, info TEXT, token TSVECTOR);
Ahora, nos toca agregar los datos generales de ambos documentos en esta tabla. Así que pruebe el siguiente comando INSERT en su shell de línea de comandos para hacerlo. Finalmente, los registros de ambos documentos se han agregado con éxito a la tabla 'Datos'.
>> INSERT INTO Data (info) VALUES ('Dos errores nunca pueden hacer que uno sea correcto.'), (' Él es el que puede jugar al fútbol.'), (' ¿Puedo participar en este?'), (' El dolor dentro de uno no se puede entender '), (' Trae melocotón a tu vida);
Ahora tienes que colonizar la columna de token de ambos documentos con su vector específico. En última instancia, una simple consulta de ACTUALIZACIÓN llenará la columna de tokens con su vector correspondiente para cada archivo. Por lo tanto, debe ejecutar la consulta que se indica a continuación en el shell de comandos para hacerlo. El resultado muestra que la actualización finalmente se realizó.
>> ACTUALIZAR Datos f1 SET token = to_tsvector (f1.info) FROM Data f2;
Ahora que lo tenemos todo en su lugar, volvamos a nuestra ilustración de "lata uno" con un escaneo. To_tsquery con el operador AND, como se dijo anteriormente, no hace ninguna diferencia entre las ubicaciones de los archivos en los archivos como se muestra en la salida que se indica a continuación.
>> SELECCIONAR ID, información DESDE los datos DONDE token @@ to_tsquery ('can & one');
Ejemplo 04:
Para encontrar palabras que están "al lado" una de la otra, intentaremos la misma consulta con el '<->'operador. El cambio se muestra en la salida a continuación.
>> SELECCIONAR ID, información DESDE los datos DONDE token @@ to_tsquery ('can <-> uno');
Aquí hay un ejemplo de una palabra no inmediata junto a otra.
>> SELECCIONAR ID, información DESDE los datos DONDE token @@ to_tsquery ('uno <-> dolor');
Ejemplo 05:
Encontraremos las palabras que no están inmediatamente una al lado de la otra usando un número en el operador de distancia para hacer referencia a la distancia. La proximidad entre 'traer' y 'vida es de 4 palabras aparte de la imagen mostrada.
>> SELECCIONAR * DE Datos DONDE token @@ to_tsquery ('traer <4> la vida');
Para comprobar la proximidad entre las palabras de casi 5 palabras se adjunta a continuación.
>> SELECCIONAR * DE Datos DONDE token @@ to_tsquery ('incorrecto <5> derecho');
Conclusión:
Finalmente, ha realizado todos los ejemplos simples y complicados de búsqueda de texto completo utilizando los operadores y funciones To_tvsector y to_tsquery.