Un lenguaje de búsqueda de texto completo de Tienda de datos cruzados simples implementado para Java 8+
La búsqueda de texto completo es una característica clave de las aplicaciones modernas. Sin embargo, diferentes almacenes de datos exponen diferentes sintaxis para realizar una búsqueda de texto completo, y muchas de estas sintaxis no son fáciles de usar. ¡Algunos almacenes de datos no exponen ninguna función de búsqueda de texto completo! Esto dificulta que los desarrolladores expongan una experiencia de búsqueda consistente orientada al usuario. Litecene es un lenguaje de consulta estándar familiar basado en la sintaxis de Lucene con transpiladores a tiendas de datos populares como BigQuery que facilita a los desarrolladores exponer una sintaxis de búsqueda coherente y fácil de usar a los usuarios mientras aprovecha al máximo las funciones de búsqueda de texto completo de su almacenamiento de datos de su aplicación.
Esta sección describe la sintaxis de consulta litecena común. Tenga en cuenta que diferentes transpiladores pueden implementar la búsqueda de texto para la misma consulta de manera diferente. Esta sección simplemente describe lo que constituye una consulta válida y la definición lógica de una coincidencia; Cada implementación del transpilador documenta exactamente cómo las consultas válidas coinciden en el almacén de datos asociado.
Como ejemplo, esta podría ser una buena consulta litecena para identificar publicaciones en las redes sociales que mencionan formas comunes en que las personas usan sus teléfonos inteligentes:
(smartphone OR "smart phone" OR iphone OR "apple phone" OR android OR "google phone" OR "windows phone" OR "phone app"~8) AND (call OR dial OR app OR surf OR browse OR camera OR picture OR pic OR selfie)
Litecene admite siete tipos de cláusulas de búsqueda: término, frase, lista, grupos y, o, y no.
Una cláusula de término es una cadena no cotizada de caracteres no blancos. Un documento coincidente debe contener el término dado. Las siguientes son todas las cláusulas de término litecene válidos:
helloworldwhat's#selfie@twitterhttps://www.example.com/this/is/a/hyperlink Una cláusula de término también puede terminar con un comodín ( * ) para indicar una búsqueda de prefijo. En este caso, un documento coincidente debe contener un término con el prefijo dado. Las siguientes son cláusulas de término de prefijo litecene válidos:
developer*what's*https://www.example.com/*Una cláusula de frase es una cadena citada de caracteres. Un documento coincidente debe contener los términos dados uno al lado del otro. Las siguientes son todas las cláusulas de frases litecenes válidas:
"hello, world!""The rain in Spain falls mainly on the plains.""super cool search" Un término en una cláusula de frase puede terminar con un comodín ( * ) para indicar una búsqueda de prefijo. En este caso, un documento coincidente debe contener los términos dados con los prefijos dados uno al lado del otro. Las siguientes son cláusulas de frases litecenas válidas con términos comodín:
"It wa* the best of times""It was the wors* of times" Una cláusula de frase puede ser seguida inmediatamente por un Tilde ( ~ ) y un número entero para indicar una búsqueda de proximidad. En este caso, un documento coincidente debe contener todos los términos regulares o de prefijo dados dentro del número dado entre sí en cualquier orden. La longitud de proximidad debe ser al menos el número de términos en la frase. Las siguientes son cláusulas de frases litecenas válidas con proximidad:
"hello, world!"~8"It wa* the best of times"~10Una cláusula de lista es dos o más cláusulas de búsqueda litecenes válidas separadas por Whitespace. Un documento coincidente debe coincidir con las cláusulas dadas en cualquier orden. Las siguientes son todas las cláusulas de frases litecenes válidas:
hello, world!The rain in Spain falls mainly on the plains.engineer* "developer* productivity"~8 Una cláusula de grupo es cualquier otra cláusula de búsqueda de litcene válida rodeada de paréntesis ( ) . Un documento coincidente debe coincidir con la cláusula contenida. Las siguientes son todas las cláusulas de grupo litecene válidos:
(hello world)(engineer* "developer* productivity"~10)Las cláusulas grupales se utilizan principalmente para aclarar consultas complejas que contienen múltiples y o cláusulas.
Una cláusula And es una cláusula de búsqueda litecena válida seguida de la palabra clave AND seguida de otra cláusula de búsqueda de litecene. Múltiples AND cláusulas se pueden agregar a la misma y cláusula. Un documento coincidente debe coincidir con todas las cláusulas dadas. Los siguientes son todos litecenos y cláusulas válidos:
hello AND worldThe rain in Spain falls mainly on the plains AND "My Fair Lady"~8engineer* AND "developer productivity"~10 Una cláusula OR es una cláusula de búsqueda litecena válida seguida de la palabra clave OR seguida de otra cláusula de búsqueda de litecene. Se pueden agregar múltiples OR cláusulas a la misma o cláusula. Cuando y / o las cláusulas están entrelazadas, el AND el operador se unen más estrictos. Se puede usar una cláusula de grupo para hacer una consulta más clara y más fácil de entender. Un documento coincidente debe coincidir con al menos una de las cláusulas dadas. Los siguientes son todos litecenes o cláusulas válidas:
hello OR world"My Fair Lady"~8 OR Pygmalion Una cláusula no es la palabra clave NOT seguida de otra cláusula de búsqueda de litecene. Un documento coincidente no debe coincidir con la cláusula dada. Las siguientes son todas válidas, no cláusulas:
NOT helloNOT "hello, world!"NOT (engineer* AND "developer productivity"~10) Algunos backends de consulta no permiten una consulta que contenga solo NOT cláusulas.
Para ver ejemplos de cómo usar Litecene en su aplicación, consulte el ReadMe para el almacén de datos de su aplicación.
Una nueva integración del almacén de datos tiene dos partes: un transpilador de consulta que convierte un objeto Query litecene en la sintaxis nativa del almacén de datos; y un método para preparar texto en el almacén de datos para buscar. Estos dos componentes deben trabajar juntos para implementar la semántica de búsqueda correcta.
Por ejemplo, la integración del almacén de datos BigQuery solo busca letras y números latinos ASCII. Por lo tanto, la consulta debe estar postprocesada para manejar los caracteres no buscados de manera apropiada antes de que pueda convertirse en un predicado SQL, y los datos en el almacén de datos deben estar preprocesados para eliminar los caracteres no buscados, y ambos procesados deben hacerse de los que están de acuerdo entre sí.
Un nuevo backend de integración de datos debe implementar un ayudante para construir una tubería de análisis de consultas sugerida y un enfoque sugerido para el preprocesamiento de datos.
Litecene implementa las siguientes tuberías para permitir que los desarrolladores de integración de almacenes de datos creen reglas de procesamiento complejas de manera rápida y fácil.
Litecene ve todo el texto de la consulta como una secuencia de puntos de código. CodePointStream es una secuencia ordenada de puntos de código. Litecene Core contiene los siguientes filtros de punto de código:
SmartQuotesCodePointFilter : convierte "citas inteligentes" en "citas directas"Los filtros de punto de código pueden asignar un punto de código a otro, pero no pueden agregar o eliminar puntos de código.
Litecene usa tokenización para convertir puntos de código en tokens. El TokenStream es una secuencia ordenada de tokens. Litecene Core contiene los siguientes filtros de token:
LetterNumberTokenFilter : reemplaza a todos los personajes no alfanuméricos con espacio blanco. La letra y el número de las categorías Unicode se utilizan para definir el texto alfanumérico.LowercaseTokenFilter : convierte todo el texto en minúsculas.NormalizeTokenFilter : realiza una normalización de unicode NFKD en el texto y elimina todos los caracteres de Mark Unicode.PrintableAsciiTokenFilter : reemplaza a todos los caracteres no en 0x20-0x7E con Whitespace.Los filtros de tokens pueden hacer cambios arbitrarios en el texto del token, pero no pueden agregar o eliminar tokens.
Litecene permite transformaciones arbitrarias de consultas utilizando una QueryPipeline . Litecene Core contiene las siguientes tuberías de consulta:
SimplifyQueryFilterPipeline : reestructura una consulta para eliminar los términos "vacíos" (por ejemplo, términos sin texto) y simplificar la lógica (por ejemplo, fusionar adyacente y consultas) La hoja de ruta de Litecene siempre está disponible aquí. ¡No dude en abrir o comentar los problemas si tiene comentarios!