# 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, sin reconocer las derivaciones de 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 para 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 (Full-Text Search Index), impulsado por la biblioteca Tantivy (opens new window), una biblioteca de motor 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 Wikipedia abstract (opens new window), que contiene más de 5,6 millones de registros, disponibles en formato Parquet. Este conjunto de datos se importará directamente en MyScale desde S3, eliminando la necesidad de descargas locales.

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

id body title url
... ... ... ...
77 Jake Rodkin is an American .... and Puzzle Agent. Jake Rodkin https://en.wikipedia.org/wiki/Jake_Rodkin (opens new window)
78 Friedlandpreis der Heimkehrer is ... of Germany. 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, 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 stem 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 base, 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 N-grama especificada
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 simple, stem, whitespace

Nombre del parámetro Tipo Valor predeterminado Descripción
stop_word_filters string[] [] Filtros de palabras de detención, especifica qué idiomas descartar palabras de detención 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 índice 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 base 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á 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 "instituto sin fines de lucro en 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, 'instituto sin fines de lucro en 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 "instituto sin fines de lucro en 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 de Tantivy (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 Nueva York, África o París. La consulta SQL sería:

SELECT
    id,
    title,
    body,
    TextSearch(body, 'Antropológico AND ("Nueva York" OR Africano OR París)") 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 "Antropológico" (sin distinción entre mayúsculas y minúsculas), satisfaciendo la condición del lado izquierdo de la declaración AND. Al mismo tiempo, cada resultado contiene al menos uno de los términos "Nueva York", "Africano" o "París", 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

# Explicación de los parámetros de TextSearch

NOTA

Los parámetros solo están disponibles en la versión de la base de datos v1.6.3 o superior.

A continuación se muestra una descripción detallada de los parámetros de TextSearch():

Parámetro Valor predeterminado Valores posibles Descripción
enable_nlq true true, false Este parámetro decide si habilitar el análisis de consultas de lenguaje natural. Cuando se establece en true, FTS interpretará la entrada del usuario como una consulta de lenguaje natural. Cuando se establece en false, FTS utilizará una consulta de términos estándar para analizar la entrada del usuario.
operator OR OR, AND Este parámetro especifica el operador lógico a utilizar para combinar cada término de consulta (tokenizado por el tokenizador). Seleccionar OR devolverá resultados que coincidan con cualquiera de las condiciones, mientras que seleccionar AND devolverá resultados que coincidan con todos los términos.

# Ejemplo de uso

SELECT
    id,
    title,
    body,
    TextSearch('enable_nlq=true', 'operator=OR')(body, 'mammoth AND Europe') AS score
FROM default.wiki_abstract_text
ORDER BY score DESC
LIMIT 5

Basándose en los resultados, cada fila contiene tanto "mammoth" como "Europe", lo cual se alinea con la lógica de habilitar la consulta de lenguaje natural.

Tenga en cuenta que solo hay 2 resultados de búsqueda. Aunque nuestra consulta SQL establece el límite en 5, solo 2 entradas en la tabla cumplen con los criterios.

id title body score
3171491 Leymus racemosus Leymus racemosus is a species of perennial wild rye known by the common name mammoth wild rye. It is native to southeastern and eastern Europe, Middle Asia, Caucasus, Siberia, China, Mongolia, New Zealand, and parts of North America. 10.067189
2719784 Venus of Hohle Fels The Venus of Hohle Fels (also known as the Venus of Schelklingen; in German variously ) is an Upper Paleolithic Venus figurine made of mammoth ivory that was unearthed in 2008 in Hohle Fels, a cave near Schelklingen, Germany. It is dated to between 35,000 and 40,000 years ago, belonging to the early Aurignacian, at the very beginning of the Upper Paleolithic, which is associated with the earliest presence of Cro-Magnon in Europe. 6.9371195
SELECT
    id,
    title,
    body,
    TextSearch('enable_nlq=false', 'operator=OR')(body, 'Atlantic AND Europe') AS score
FROM default.wiki_abstract_text
ORDER BY score DESC
LIMIT 5

Después de deshabilitar la consulta de lenguaje natural, los resultados ya no garantizan la aparición simultánea de "Atlantic" y "Europe". Dado que el valor predeterminado del operador es OR, se incluirá cualquier fila que contenga "Atlantic", "AND" o "Europe" en los resultados de búsqueda.

id title body score
3046233 And And or AND may refer to: 13.748591
5050203 A N D (Tricot album) And}} 13.047318
357499 Andromeda I And 1}} 12.335348
678064 Omicron Andromedae And 1}} 12.335348
3716928 Platycheirus ramsaerensis Platycheirus ramsaerensis is a species of hoverfly. It is found along the parts of northern Europe that face the Atlantic. 11.937536

# Aprovechando 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 Realice 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 Realice una búsqueda de varias palabras clave, encontrando artículos que contengan Eiffel Tower pero no Paris.

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

Resultado:

count()
2828

Ejemplo - 3 Realice 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: Sun Jun 30 2024 09:15:57 GMT+0000