Uma loja de pesquisa de texto completo simples, implementado para Java 8+
A pesquisa de texto completo é um recurso fundamental dos aplicativos modernos. No entanto, diferentes lojas de dados expõem diferentes sintaxes para realizar pesquisas de texto completo, e muitas dessas sintaxes não são amigáveis. Algumas lojas de dados não expõem nenhum recurso de pesquisa de texto completo! Isso dificulta que os desenvolvedores exponham uma experiência consistente de pesquisa voltada para o usuário. O Litecene é uma linguagem de consulta padrão familiar baseada na sintaxe do Lucene com transpilers a lojas de dados populares, como o BigQuery, que facilita os desenvolvedores a expor uma sintaxe de pesquisa consistente e amigável ao usuário para os usuários, ao mesmo tempo em que aproveita ao máximo os recursos de pesquisa de texto completo do Application Data Store.
Esta seção descreve a sintaxe comum de consulta do Litecene. Observe que diferentes transpilers podem implementar a pesquisa de texto para a mesma consulta de maneira diferente. Esta seção descreve apenas o que constitui uma consulta válida e a definição lógica de uma correspondência; Cada documentos de implementação do Transpiler exatamente como as consultas válidas são correspondentes no armazenamento de dados associados.
Como exemplo, essa pode ser uma boa consulta do Litecene para identificar postagens de mídia social mencionando maneiras comuns de maneiras que as pessoas usam seus smartphones:
(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)
O Litecene suporta sete tipos de cláusula de pesquisa: termo, frase, listar, grupos e, e, e, e não.
Uma cláusula de termo é uma sequência de caracteres não citados. Um documento correspondente deve conter o termo fornecido. A seguir, todas as cláusulas de termo Litecene válidas:
helloworldwhat's#selfie@twitterhttps://www.example.com/this/is/a/hyperlink Uma cláusula de termo também pode terminar com um curinga ( * ) para indicar uma pesquisa de prefixo. Nesse caso, um documento correspondente deve conter um termo com o prefixo fornecido. A seguir, todas as cláusulas de termo de prefixo Litecene válidas:
developer*what's*https://www.example.com/*Uma cláusula de frase é uma sequência de caracteres citados. Um documento correspondente deve conter os termos fornecidos um ao lado do outro. A seguir, são todas as cláusulas de frase Litecene válidas:
"hello, world!""The rain in Spain falls mainly on the plains.""super cool search" Um termo em uma cláusula de frase pode terminar com um curinga ( * ) para indicar uma pesquisa de prefixo. Nesse caso, um documento correspondente deve conter os termos fornecidos com os prefixos fornecidos um ao lado do outro. A seguir, todas as cláusulas de frase litecene válidas com termos curinga:
"It wa* the best of times""It was the wors* of times" Uma cláusula de frase pode ser seguida imediatamente por uma tilde ( ~ ) e um número inteiro para indicar uma pesquisa de proximidade. Nesse caso, um documento correspondente deve conter todos os termos regulares ou prefixados dentro do número fornecido de termos um do outro em qualquer ordem. O comprimento da proximidade deve ser pelo menos o número de termos na frase. A seguir, são válidas cláusulas de frase litecene com proximidade:
"hello, world!"~8"It wa* the best of times"~10Uma cláusula de lista é duas ou mais cláusulas de pesquisa de Litecene válidas separadas pelo espaço em branco. Um documento correspondente deve corresponder às cláusulas fornecidas em qualquer ordem. A seguir, são todas as cláusulas de frase Litecene válidas:
hello, world!The rain in Spain falls mainly on the plains.engineer* "developer* productivity"~8 Uma cláusula de grupo é qualquer outra cláusula de busca válida do Litcene cercada por parênteses ( ) . Um documento correspondente deve corresponder à cláusula contida. A seguir, todas as cláusulas do grupo Litecene válidas:
(hello world)(engineer* "developer* productivity"~10)As cláusulas de grupo são usadas principalmente para esclarecer consultas complexas contendo várias e / ou cláusulas.
Uma cláusula e é uma cláusula válida de busca de Litecene seguida pela palavra -chave AND seguida por outra cláusula de pesquisa de Litecene. Várias AND cláusulas podem ser anexadas à mesma cláusula e cláusula. Um documento correspondente deve corresponder a todas as cláusulas dadas. A seguir, todos os seguintes Litecene e Cláusulas:
hello AND worldThe rain in Spain falls mainly on the plains AND "My Fair Lady"~8engineer* AND "developer productivity"~10 Uma cláusula de OR é uma cláusula válida de pesquisa de Litecene seguida pela palavra -chave OR seguida por outra cláusula de pesquisa do Litecene. Múltiplas OR cláusulas podem ser anexadas à mesma cláusula ou cláusula. Quando e / ou cláusulas são intercaladas, o operador AND o operador se liga mais apertado. Uma cláusula de grupo pode ser usada para tornar uma consulta mais clara e fácil de entender. Um documento correspondente deve corresponder a pelo menos uma das cláusulas dadas. A seguir, todos os seguintes litecene ou cláusulas:
hello OR world"My Fair Lady"~8 OR Pygmalion Uma cláusula não é a palavra -chave NOT seguida por outra cláusula de pesquisa de Litecene. Um documento correspondente não deve corresponder à cláusula fornecida. A seguir, todos os titcene válidos não são cláusulas:
NOT helloNOT "hello, world!"NOT (engineer* AND "developer productivity"~10) Alguns back -ends de consulta não permitem uma consulta que contém apenas NOT .
Para obter exemplos de como usar o Litecene em seu aplicativo, consulte o ReadMe para o armazenamento de dados do seu aplicativo.
Uma nova integração do armazenamento de dados possui duas partes: um transpiler de consulta que converte um objeto Query Litecene na sintaxe nativa do armazenamento de dados; e um método para preparar o texto no armazenamento de dados para pesquisa. Esses dois componentes devem trabalhar juntos para implementar a semântica de pesquisa correta.
Por exemplo, a integração do BigQuery Data Store pesquisa apenas letras e números latinos ASCII. Portanto, a consulta deve ser pós-processada para lidar com caracteres não pesquisados adequadamente antes de ser convertida em um predicado SQL, e os dados no armazenamento de dados devem ser pré-processados para eliminar caracteres não pesquisados, e ambos os processados devem ser feitos de modo que eles concordem.
Um novo back -end de integração de dados deve implementar um ajudante para construir um pipeline de análise de consulta sugerido e uma abordagem sugerida para o pré -processamento de dados.
O Litecene implementa os seguintes oleodutos para permitir que os desenvolvedores de integração do armazenamento de dados criem regras de processamento complexas de maneira rápida e fácil.
O Litecene vê todo o texto de consulta como uma sequência de pontos de código. O CodePointStream é uma sequência ordenada de pontos de código. Litecene Core contém os seguintes filtros de ponto de código:
SmartQuotesCodePointFilter - converte "citações inteligentes" em "citações diretas"Os filtros de ponto de código podem mapear um código para outro, mas não podem adicionar ou remover pontos de código.
O Litecene usa tokenização para converter pontos de código em tokens. O TokenStream é uma sequência ordenada de tokens. Litecene Core contém os seguintes filtros de token:
LetterNumberTokenFilter -substitui todos os caracteres não alfanuméricos por espaço em branco. A letra e o número das categorias Unicode são usadas para definir o texto alfanumérico.LowercaseTokenFilter - converte todo o texto em minúsculas.NormalizeTokenFilter - executa a normalização do Unicode NFKD no texto e remove todos os caracteres Unicode Mark.PrintableAsciiTokenFilter -substitui todos os caracteres que não estão em 0x20-0x7E pelo espaço em branco.Os filtros de token podem fazer alterações arbitrárias no texto do token, mas não podem adicionar ou remover tokens.
O Litecene permite transformações de consulta arbitrárias usando uma QueryPipeline . O Litecene Core contém os seguintes oleodutos de consulta:
SimplifyQueryFilterPipeline - reestrutura uma consulta para remover termos "vazios" (por exemplo, termos sem texto) e simplificar a lógica (por exemplo, mesclar adjacente e consultas) O roteiro de Litecene está sempre disponível aqui. Sinta -se à vontade para abrir ou comentar sobre problemas se tiver feedback!