# Búsqueda de texto completo

NOTA

Esta guía solo es aplicable a la versión de la base de datos 1.5.0 o superior.

Las capacidades tradicionales de búsqueda textual en bases de datos con operadores como LIKE e ILIKE han sido fundamentales durante años. Sin embargo, no logran satisfacer las necesidades de los sistemas modernos de recuperación de información debido a varias limitaciones:

  • Falta de soporte lingüístico: Los métodos tradicionales tienen dificultades con los matices del lenguaje, ya que no reconocen las derivaciones de las palabras (por ejemplo, "satisfies" vs. "satisfy"), lo que puede llevar a resultados de búsqueda incompletos o inexactos. Aunque es posible buscar manualmente variaciones utilizando OR, este enfoque es engorroso y propenso a errores.
  • Ausencia de clasificación de resultados: Sin la capacidad de clasificar los resultados de búsqueda, buscar entre miles de coincidencias se vuelve ineficiente.
  • Problemas de rendimiento: La falta de soporte de índices significa que cada documento debe procesarse en cada búsqueda, lo que lleva a un rendimiento lento.

Para superar estos desafíos, MyScale introduce un nuevo tipo de índice llamado FTS Index (Índice de búsqueda de texto completo), impulsado por la biblioteca Tantivy (opens new window), una biblioteca de búsqueda de texto completo de código abierto y alto rendimiento. El FTS Index admite el algoritmo de indexación BM25, lo que permite obtener resultados de búsqueda eficientes y relevantes. Esta integración mejora la funcionalidad de búsqueda de texto completo de MyScale y mejora el rendimiento general.

# Resumen del tutorial

Este tutorial le guiará a través de la realización de tres tipos de experimentos de búsqueda con índices FTS:

Ilustración del índice FTS en MyScale

Antes de comenzar, asegúrese de tener configurado un clúster de MyScale. Para obtener instrucciones de configuración, consulte nuestra Guía de inicio rápido (opens new window).

# Descripción general del conjunto de datos

Utilizaremos el conjunto de datos de resúmenes de Wikipedia (Wikipedia abstract dataset), que contiene más de 5,6 millones de registros y está disponible en formato Parquet. Este conjunto de datos se importará directamente en MyScale desde S3, lo que elimina la necesidad de descargas locales.

La siguiente tabla describe brevemente el contenido de este conjunto de datos.

id body title url
... ... ... ...
77 Jake Rodkin es un estadounidense .... y Puzzle Agent. Jake Rodkin https://en.wikipedia.org/wiki/Jake_Rodkin (opens new window)
78 Friedlandpreis der Heimkehrer es ... de Alemania. Friedlandpreis der Heimkehrer https://en.wikipedia.org/wiki/Friedlandpreis_der_Heimkehrer (opens new window)
... ... ... ...

# Creación y población de la tabla

Cree la tabla en_wiki_abstract en MyScale utilizando el siguiente comando SQL:

CREATE TABLE default.en_wiki_abstract(
    `id` UInt64,
    `body` String,
    `title` String,
    `url` String,
)
ENGINE = MergeTree
ORDER BY id;

Luego, importe el conjunto de datos desde S3. Espere pacientemente a que se complete la importación de datos.

INSERT INTO default.en_wiki_abstract SELECT * FROM s3('https://myscale-datasets.s3.ap-southeast-1.amazonaws.com/wiki_abstract_5m.parquet','Parquet');

Verifique que la tabla contenga 5,648,453 filas de datos.

SELECT count(*) FROM default.en_wiki_abstract;

Resultado:

count()
5648453

Para mejorar el rendimiento de búsqueda, podemos optimizar la tabla consolidándola en una sola parte de datos. Este paso es opcional.

OPTIMIZE TABLE default.en_wiki_abstract FINAL;

Ejecute la siguiente instrucción SQL para verificar si los datos de esta tabla se han comprimido en una sola parte.

SELECT COUNT(*) FROM system.parts
WHERE table = 'en_wiki_abstract' AND active = 1;

Si los datos se comprimen en 1 parte, esta instrucción SQL devolverá el siguiente conjunto de resultados:

count()
1

# Comprensión de los parámetros del índice FTS

MyScale admite varios tokenizadores, cada uno adecuado para diferentes escenarios. Al crear un índice FTS, puede personalizarlo con una configuración JSON para el tokenizador.

TIP

Proporcione una cadena JSON válida en el parámetro del índice FTS.

-- Ejemplo 1: Crear un índice sin especificar parámetros, utilizando la configuración predeterminada
ALTER TABLE [nombre_de_tabla] ADD INDEX [nombre_de_indice] [nombre_de_columna]
TYPE fts;
-- Ejemplo 2: Crear un índice utilizando el tokenizador predeterminado
ALTER TABLE [nombre_de_tabla] ADD INDEX [nombre_de_indice] [nombre_de_columna]
TYPE fts('{"[nombre_de_columna]":{"tokenizer":{"type":"default"}}}');
-- Ejemplo 3: Utilizar el tokenizador de derivación y aplicar palabras de detención
ALTER TABLE [nombre_de_tabla] ADD INDEX [nombre_de_indice] [nombre_de_columna]
TYPE fts('{"[nombre_de_columna]":{"tokenizer":{"type":"stem", "stop_word_filters":["english"]}}}');

La siguiente tabla enumera los tipos de tokenizadores admitidos por el índice FTS.

Tipo de tokenizador Descripción
default Tokenizador predeterminado, divide el texto en caracteres no alfabéticos, sin distinción entre mayúsculas y minúsculas
raw Tokenizador sin procesar, no realiza tokenización en el texto, trata todo el texto como un solo token
simple Tokenizador simple, divide el texto en caracteres no alfabéticos
stem Tokenizador de derivación, compatible con varios idiomas, convierte las palabras a su forma de raíz, puede ignorar los tiempos verbales de las palabras
whitespace Tokenizador de espacios en blanco, divide el texto en caracteres de espacio en blanco (espacios, tabulaciones, saltos de línea, etc.)
ngram Tokenizador de N-gramas, divide el texto en función de la longitud de los n-gramas especificados
chinese Tokenizador chino, realiza la tokenización en texto chino, utiliza internamente la biblioteca de tokenización jieba

# Parámetros comunes del tokenizador

Los tokenizadores raw y stem solo admiten el parámetro store_doc, mientras que los demás tokenizadores admiten los siguientes parámetros comunes además de los mencionados anteriormente.

Nombre del parámetro Tipo Valor predeterminado Descripción
store_doc booleano false Si se debe almacenar el documento original, actualmente no se recomienda habilitarlo
length_limit número 40 Longitud máxima de los tokens tokenizados
case_sensitive booleano false Si la tokenización distingue entre mayúsculas y minúsculas

La mayoría de los tokenizadores admiten parámetros adicionales además de los comunes mencionados anteriormente.

# Tokenizadores simplestemwhitespace

Nombre del parámetro Tipo Valor predeterminado Descripción
stop_word_filters string[] [] Filtros de palabras de detención, especifica qué idiomas descartar durante la tokenización, todos los idiomas válidos incluyen ["danish", "dutch", "english", "finnish", "french", "german", "hungarian", "italian", "norwegian", "portuguese", "russian", "spanish", "swedish"]

# Tokenizador stem

Nombre del parámetro Tipo Valor predeterminado Descripción
stem_languages string[] [] Idiomas utilizados para la derivación, para el inglés, puede ignorar los tiempos verbales durante la tokenización, los idiomas admitidos para el tokenizador de derivación son ["arabic", "danish", "dutch", "english", "finnish", "french", "german", "greek", "hungarian", "italian", "norwegian", "portuguese", "romanian", "russian", "spanish", "swedish", "tamil", "turkish"]

# Tokenizador ngram

Nombre del parámetro Tipo Valor predeterminado Descripción
min_gram número 2 Número mínimo de gramas
max_gram número 3 Número máximo de gramas
prefix_only booleano false Si solo se deben extraer n-gramas del prefijo de las palabras

# Tokenizador chinese

Para el tokenizador chino, se utiliza cang-jie (opens new window) como implementación subyacente.

Nombre del parámetro Tipo Valor predeterminado Descripción
jieba string "default" "default" significa usar el diccionario jieba, "empty" significa no usar el diccionario jieba incorporado para la tokenización. Los valores válidos son "default" o "empty"
mode string "search" Modo de tokenización chino, los valores válidos son "all", "default", "search" o "unicode", las diferencias entre cada modo se pueden consultar en cang-jie/options.rs (opens new window)
hmm booleano false Si habilitar HMM

Lo anterior proporciona una descripción detallada de los parámetros para los tokenizadores de índices FTS de MyScale. Al crear un índice FTS, puede seleccionar el tipo de tokenizador que mejor se adapte a sus necesidades y configurar sus parámetros para mejorar el rendimiento y los resultados de búsqueda.

# Creación de un índice FTS

Personalice su índice FTS con el tokenizador adecuado para optimizar el rendimiento de búsqueda. Por ejemplo, utilizar el tokenizador stem con palabras de detención en inglés puede mejorar la precisión de la búsqueda al centrarse en la forma raíz de las palabras.

ALTER TABLE default.en_wiki_abstract
ADD INDEX body_idx (body)
TYPE fts('{"body":{"tokenizer":{"type":"stem", "stop_word_filters":["english"]}}}');

Normalmente, el índice FTS (similar a los índices de salto en ClickHouse) solo se aplica a los datos recién insertados, por lo que simplemente agregar el índice no afectará a los datos existentes. Para indexar los datos ya existentes, utilice esta instrucción:

ALTER TABLE default.en_wiki_abstract MATERIALIZE INDEX body_idx;

# Búsqueda con clasificación de documentos BM25

Nota

La primera ejecución de TextSearch() puede ser más lenta porque necesita cargar el índice FTS.

El siguiente ejemplo muestra cómo utilizar la función TextSearch(). El ejemplo devuelve los 10 documentos más relevantes para "non-profit institute in Washington". La métrica para medir la relevancia es la puntuación BM25 devuelta por la función TextSearch(); cuanto mayor sea la puntuación, más relevante será.

SELECT
    id,
    title,
    body,
    TextSearch(body, 'non-profit institute in Washington') AS score
FROM default.en_wiki_abstract
ORDER BY score DESC
LIMIT 5;

A partir de los resultados, podemos ver que el texto en cada fila de la columna body está relacionado con la frase de búsqueda "non-profit institute in Washington".

id title body score
3400768 Drug Strategies Drug Strategies is a non-profit research institute located in Washington D.C. 24.457561
872513 Earth Policy Institute Earth Policy Institute was an independent non-profit environmental organization based in Washington, D.C. 22.730673
895248 Arab American Institute Founded in 1985, the Arab American Institute is a non-profit membership organization based in Washington D.C. 21.955559
1950599 Environmental Law Institute The Environmental Law Institute (ELI) is a non-profit, non-partisan organization, headquartered in Washington, D.C. 21.231567
2351478 Public Knowledge Public Knowledge is a non-profit Washington, D.C. 20.742344

# Aprovechando las consultas de lenguaje natural

MyScale utiliza la biblioteca Tantivy para la indexación de búsqueda de texto completo (FTS), lo que permite admitir consultas de lenguaje natural complejas. Para obtener más información, consulte la documentación oficial (opens new window).

Aquí hay un ejemplo de una consulta de combinación de múltiples condiciones utilizando AND y OR. Queremos buscar temas antropológicos relacionados con la ciudad de Nueva York, África o París. La consulta SQL sería:

SELECT
    id,
    title,
    body,
    TextSearch(body, 'Anthropological AND ("New York City" OR African OR Paris)') AS score
FROM default.en_wiki_abstract
ORDER BY score DESC
LIMIT 5;

Los resultados de búsqueda muestran que cada línea de texto contiene la palabra "Anthropological" (sin distinción entre mayúsculas y minúsculas), cumpliendo la condición del lado izquierdo de la declaración AND. Al mismo tiempo, cada resultado contiene al menos uno de "New York City", "African" o "Paris", cumpliendo la condición de coincidencia del lado derecho de la declaración AND.

id title body score
2826913 African Anthropologist African Anthropologist is the journal of the Pan African Anthropological Association (PAAA). 20.131313
3905943 Tunnel People Tunnel People is an anthropological-journalistic account describing an underground homeless community in New York City. It is written by war photographer and anthropologist Teun Voeten and was published by PM Press in 2010. 13.759308
3790627 Les Accords de Bella Les Accords de Bella is a 2007 anthropological documentary film directed by David Constantin. It was selected by the African Film Festival of Cordoba - FCAT. 12.769518
4488199 Naparay Naparay, in African anthropological study, is a non-linear conception of human life held by some West African peoples such as the Yoruba. Similar to reincarnation, naparay holds that lives are cyclic and attributes of previous lives may carry over to a new life. 11.682068
1725559 Gradhiva Gradhiva is an anthropological and museological journal, founded in 1986 by the poet and social scientist Michel Leiris and by the anthropologist Jean Jamin. It is since 2005 published by the Musée du Quai Branly in Paris. 11.135916

# Utilizando SkipIndex para buscar en cadenas

Cuando se utilizan las siguientes funciones integradas de ClickHouse para búsquedas de cadenas, todas se filtrarán a través del índice FTS: equals, notEquals, like, notLike, hasToken, hasTokenOrNull, in, notIn,startsWith,endsWith,has,mapContains,multiSearchAny.

Ejemplo 1: Realizar una búsqueda de palabras clave simple, como buscar la palabra 'Tsinghua'.

SELECT count(*)
FROM default.en_wiki_abstract
WHERE hasToken(body, 'Tsinghua');

Resultado:

count()
81

Ejemplo 2: Realizar una búsqueda de varias palabras clave, encontrar artículos que contengan la Torre Eiffel pero no París.

SELECT count(*)
FROM default.en_wiki_abstract
WHERE (NOT hasToken(body, 'Paris')) AND multiSearchAny(body, ['Eiffel', 'Tower'])

Resultado:

count()
2828

Ejemplo 3: Realizar una consulta de combinación condicional compleja, combinando diferentes nombres, lugares, disciplinas y otros términos.

SELECT count(*)
FROM default.en_wiki_abstract
WHERE (NOT multiSearchAny(body, ['Montessori', 'postulated', 'Rooney'])) AND (hasToken(body, 'Patsy') OR hasToken(body, 'Anthropological'))

Resultado:

count()
204

# Conclusión

Esta guía le ha mostrado cómo aprovechar MyScale para capacidades avanzadas de búsqueda de texto, desde la configuración de índices FTS hasta la ejecución de consultas de lenguaje natural. Al aplicar estas técnicas, puede administrar y buscar eficientemente datos de texto no estructurados, mostrando las sólidas capacidades de procesamiento de texto de MyScale.

Last Updated: Mon Apr 29 2024 08:06:28 GMT+0000