Un simple langage de recherche de texte en texte intégré implémenté pour Java 8+ pour Java 8+
La recherche en texte complet est une caractéristique clé des applications modernes. Cependant, différents magasins de données exposent différentes syntaxes pour effectuer une recherche en texte complet, et bon nombre de ces syntaxes ne sont pas conviviales. Certains magasins de données n'exposent aucune fonctionnalité de recherche en texte intégral! Cela rend difficile pour les développeurs d'exposer une expérience de recherche cohérente orientée par les utilisateurs. Litecene est un langage de requête standard familier basé sur la syntaxe de Lucene avec des transpiles dans des magasins de données populaires comme BigQuery qui permet aux développeurs de dénoncer facilement une syntaxe de recherche cohérente et conviviale aux utilisateurs tout en tirant le meilleur parti des fonctionnalités de recherche de texte intégrale de leur magasin de données d'application.
Cette section décrit la syntaxe de requête litecène commune. Notez que différents transpiles peuvent implémenter la recherche de texte pour la même requête différemment. Cette section décrit simplement ce qui constitue une requête valide et la définition logique d'une correspondance; Chaque implémentation de transpiller documente exactement comment les requêtes valides sont appariées dans le magasin de données associé.
À titre d'exemple, cela pourrait être une bonne requête litecène pour identifier les publications sur les réseaux sociaux mentionnant des façons courantes dont les gens utilisent leurs 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)
LiteCene prend en charge sept types de clause de recherche: terme, phrase, liste, groupes et, ou non.
Une clause de terme est une chaîne non ciblée de caractères non blancs. Un document correspondant doit contenir le terme donné. Voici tous des clauses à terme litecène valides:
helloworldwhat's#selfie@twitterhttps://www.example.com/this/is/a/hyperlink Une clause de terme peut également se terminer par un joker ( * ) pour indiquer une recherche de préfixe. Dans ce cas, un document correspondant doit contenir un terme avec le préfixe donné. Voici tous des clauses de terme préfixe du litecène valide:
developer*what's*https://www.example.com/*Une clause de phrase est une chaîne de caractères citée. Un document correspondant doit contenir les termes donnés les uns à côté des autres. Voici tous des clauses de phrase litecène valides:
"hello, world!""The rain in Spain falls mainly on the plains.""super cool search" Un terme dans une clause de phrase peut se terminer par un joker ( * ) pour indiquer une recherche de préfixe. Dans ce cas, un document correspondant doit contenir les termes donnés avec les préfixes donnés les uns à côté des autres. Voici tous des clauses de phrase litecène valides avec des termes génériques:
"It wa* the best of times""It was the wors* of times" Une clause de phrase peut être suivie immédiatement par un Tilde ( ~ ) et un numéro entier pour indiquer une recherche de proximité. Dans ce cas, un document correspondant doit contenir tous les termes réguliers ou préfixés dans le nombre donné des termes les uns des autres dans n'importe quel ordre. La longueur de proximité doit être au moins le nombre de termes dans la phrase. Voici des clauses de phrase litecène valides avec proximité:
"hello, world!"~8"It wa* the best of times"~10Une clause de liste est deux ou plusieurs clauses de recherche Litecene valides séparées par l'espace blanc. Un document correspondant doit correspondre aux clauses données dans n'importe quel ordre. Voici tous des clauses de phrase litecène valides:
hello, world!The rain in Spain falls mainly on the plains.engineer* "developer* productivity"~8 Une clause de groupe est toute autre clause de recherche de litcène valide entourée de parenthèses ( ) . Un document correspondant doit correspondre à la clause contenue. Voici toutes des clauses de groupe litecène valides:
(hello world)(engineer* "developer* productivity"~10)Les clauses de groupe sont utilisées principalement pour clarifier les requêtes complexes contenant plusieurs clauses et / ou.
Une clause et une clause de recherche LiteCene valide suivie du mot-clé AND suivie d'une autre clause de recherche LiteCene. Plusieurs AND les clauses peuvent être annexées à la même et à la clause. Un document correspondant doit correspondre à toutes les clauses données. Voici tous le litecène et les clauses valides:
hello AND worldThe rain in Spain falls mainly on the plains AND "My Fair Lady"~8engineer* AND "developer productivity"~10 Une clause ou est une clause de recherche LiteCene valide suivie du mot-clé OR suivie d'une autre clause de recherche LiteCene. Plusieurs OR clauses peuvent être annexées à la même ou à la clause. Lorsque les clauses et ou / ou sont entrelacées, l'opérateur AND l'opérateur se lie plus. Une clause de groupe peut être utilisée pour rendre une requête plus claire et plus facile à comprendre. Un document correspondant doit correspondre au moins une des clauses données. Les éléments suivants sont tous du litecène ou des clauses valides:
hello OR world"My Fair Lady"~8 OR Pygmalion Une clause Not est le mot-clé NOT suivi d'une autre clause de recherche LiteCene. Un document correspondant ne doit pas correspondre à la clause donnée. Les éléments suivants sont tous des clauses de litcène valides:
NOT helloNOT "hello, world!"NOT (engineer* AND "developer productivity"~10) Certains backends de requête ne permettent pas une requête qui ne contient NOT de clauses.
Pour des exemples d'utilisation du litecène dans votre application, reportez-vous à la lecture du magasin de données de votre application.
Une nouvelle intégration du magasin de données a deux parties: un transpilateur de requête qui convertit un objet Query LiteCene en syntaxe native du magasin de données; et une méthode pour préparer du texte dans le magasin de données pour la recherche. Ces deux composants doivent travailler ensemble pour implémenter la sémantique de recherche correcte.
Par exemple, l'intégration de BigQuery Data Store ne recherche que les lettres et les nombres latins ASCII. Par conséquent, la requête doit être post-traitée pour gérer les caractères non recherchés de manière appropriée avant de pouvoir être converti en un prédicat SQL, et les données du magasin de données doivent être prétraitées pour éliminer les caractères non recherchés, et ces deux traités doivent être faits de manière à être d'accord.
Un nouveau backend d'intégration de données doit mettre en œuvre une aide pour construire un pipeline d'analyse de requête suggéré et une approche suggérée du prétraitement des données.
LiteCene implémente les pipelines suivants pour permettre aux développeurs d'intégration des magasins de données de créer des règles de traitement complexes rapidement et facilement.
LiteCene considère tout le texte de requête comme une séquence de points de code. Le CodePointStream est une séquence ordonnée de points de code. Litecene Core contient les filtres de point de code suivants:
SmartQuotesCodePointFilter - convertit les «citations intelligentes» en «citations droites»Les filtres de point de code peuvent mapper un point de code à un autre, mais ne peuvent pas ajouter ou supprimer des points de code.
LiteCene utilise la tokenisation pour convertir les points de code en jetons. Le TokenStream est une séquence ordonnée de jetons. Litecene Core contient les filtres à jeton suivants:
LetterNumberTokenFilter - remplace tous les caractères non alphanumériques avec des espaces blancs. La lettre et le numéro des catégories Unicode sont utilisés pour définir le texte alphanumérique.LowercaseTokenFilter - convertit tout le texte en minuscules.NormalizeTokenFilter - effectue une normalisation Unicode NFKD sur le texte et supprime tous les caractères de marque Unicode.PrintableAsciiTokenFilter - remplace tous les caractères qui ne sont pas dans 0x20-0x7E par un espace blanc.Les filtres à jeton peuvent apporter des modifications arbitraires en texte de jeton, mais ne peuvent pas ajouter ou supprimer les jetons.
LiteCene permet des transformations de requête arbitraires à l'aide d'un QueryPipeline . Litecene Core contient les pipelines de requête suivantes:
SimplifyQueryFilterPipeline - restructure une requête pour supprimer les termes "vide" (par exemple, termes sans texte) et simplifier la logique (par exemple, fusionner adjacente et requêtes) La feuille de route de Litecene est toujours disponible ici. N'hésitez pas à ouvrir ou à commenter les problèmes si vous avez des commentaires!