Localisation de la recherche
Recherche de texte intégral sans serveur dans Python
️ Statut dormant :? ?
LocaSticSearch fournit une recherche de texte intégral sans serveur alimenté par les capacités de recherche de texte intégral SQLite mais essayant d'être compatible avec (un sous-ensemble de) l'API Elasticsearch.
De cette façon, vous pouvez développer confortablement votre appplication de recherche de texte sans avoir besoin de configurer des services et de passer en douceur vers Elasticsearch pour l'échelle ou les fonctionnalités sans modification de votre code.
Cela dit, si vous effectuez uniquement des opérations de recherche de base dans le sous-ensemble pris en charge par cette bibliothèque et que vous n'avez pas beaucoup de documents (~ millions) qui justifieraient d'aller pour un déploiement de cluster, LocasticSearch peut être une alternative plus rapide à Elasticsearch.
Commencer
from locasticsearch import Locasticsearch
from datetime import datetime
es = Locasticsearch()
doc = {
"author": "kimchy",
"text": "Elasticsearch: cool. bonsai cool.",
"timestamp": datetime(2010, 10, 10, 10, 10, 10),
}
res = es.index(index="test-index", doc_type="tweet", id=1, body=doc)
res = es.get(index="test-index", doc_type="tweet", id=1)
print(res["_source"])
# this will get ignored in Locasticsearch
es.indices.refresh(index="test-index")
res = es.search(index="test-index", body={"query": {"match_all": {}}})
print("Got %d Hits:" % res["hits"]["total"]["value"])
for hit in res["hits"]["hits"]:
print("%(timestamp)s %(author)s: %(text)s" % hit["_source"])
Nous ajoutons également une API simplifiée qui peut être convertie en Elasticsearch.
Caractéristiques
- ?% local, pas de gestion du serveur
- Python pur léger, pas de dépendances externes
- ⚡ Recherches super rapides grâce aux capacités de recherche de texte intégral SQLite
- ? Pas de verrouillage. Grâce à la compatibilité API avec le client officiel, vous pouvez passer en douceur à Elasticsearch pour l'échelle ou plus de fonctionnalités sans modifier votre code.
Installer
pip install locasticsearch
À utiliser ou à ne pas utiliser
Vous ne devez pas utiliser LocasticSearch si:
- Vous déployez une application sensible à la sécurité. Le code de recherche sur location est très sujet aux attaques d'injection SQL. Cela devrait s'améliorer dans les versions futures.
- Vos recherches sont plus compliquées que ce que vous trouverez dans un tutoriel Elasticsearch de 5 minutes. Elasticsearch a une énorme API et il est très peu probable que nous puissions soutenir même une partie importante de cela.
- Vous détestez les bibliothèques buggy. LocaSticSearch est un très jeune projet, donc les bogues sont garantis. Vous pouvez vérifier les tests pour voir si vos besoins sont couverts.
Vous devez utiliser LocasticSearch si:
- Vous ne voulez pas d'un Docker ou d'un service Elasticsearch en utilisant des ressources précieuses dans votre ordinateur portable
- Vous avez seulement besoin de recherche de texte de base et Elasticsearch serait exagéré
- Vous voulez des déploiements très faciles qui impliquent uniquement des installations PIP
- L'utilisation de Java d'un programme Python vous fait vous sentir sale
Étapes suivantes
Comparaison avec des bibliothèques similaires
Quelques réflexions rapides sur les outils existants, n'hésitez pas à ajouter / commenter:
whoosh
La bibliothèque de recherche de texte Python la plus complète en vedette de loin de loin:
- ? Prise en charge les points forts, les analyseurs, l'extension de requête, plusieurs fonctions de classement, ...
- ? Non lié pendant longtemps, mais pourrait voir un renouveau à https://github.com/whoosh-communnity/whoosh
- ? Pur python donc pas aussi bien (toujours assez rapide pour les ensembles de données petits / moyens)
Elasticsearch
Le grand champion de la recherche en texte intégral. C'est ce que vous devriez utiliser en production:
- ? Beaucoup de fonctionnalités pour accueillir n'importe quel cas d'utilisation
- ? Testé de bataille, évolutif, performant
- ? Native non Python: plus complexe à déployer / intégrer au projet Python pour des cas d'utilisation faciles
tantivy
Ceci est une bonne recommandation pour la recherche de texte intégral local si vous ne vous souciez pas de la compatibilité de l'API de recherche élastique
- ? Simple à configurer et à utiliser:
pip install tantivy - ? Moteur à base de rouille rapide
- ? DSL / Bibliothèque Lock In, pas API de recherche élastique
pyserini
Bien qu'il ne soit pas pur python, Pyserini est un bon compromis si vous voulez quelque chose de local et évolutif:
- ? Access à Lucene de l'intérieur de Python (via le pont de Pyjnius Java)
- ? Déploiement sans serveur / local
- ? DSL / Bibliothèque verrouiller
- ? Exécution de Java supplémentaire
botte de foin django
Django Haystack fournit une API unifiée qui vous permet de brancher différents backends de recherche (tels que Solr, Elasticsearch, Whoosh, Xapian, etc.) sans avoir à modifier votre code:
- ? De nombreuses fonctionnalités, augmentant, surlignement, assortie automatique (certains dépendant du backend)
- ? Possibilité de changer de backends
- ? DSL / Bibliothèque verrouiller
- ? Malgré le soutien de plusieurs backends, Whoosh est le seul à être originaire de Python.
xapien
- ? Très rapide et complet en vedette (C ++)
- ? Pas d'installation de PIP (Besoin de compilation au niveau du système)
- ? Les liaisons Python et la documentation ne sont pas si conviviales
gensim
Bien que Gensim se concentre sur la modélisation des sujets, vous pouvez utiliser TfidfModel et SparseMatrixSimilarity pour la recherche de texte. Cela dit, cela n'utilise pas un index inversé (recherche linéaire), il a donc une évolutivité limitée.
- ? Des fonctionnalités uniques telles que la recherche approximative
- ? L'accent est mis sur la modélisation des sujets, donc pas d'API intuitive pour l'ingestion / recherche en texte intégral
- ? Ne prend pas en charge la recherche d'index inversés (principalement une analyse complète et approximative)
peewee
Peewee est en fait un ORM plus général mais propose des abstractions pour utiliser la recherche de texte intégral sur SQLite:
- ? Prise en charge de la recherche de texte intégral à l'aide de plusieurs backends SQL (pas de recherche Elastics cependant)
- ? Fonctions de classement et d'analyseur personnalisés
- ? Aucune API compatible Elasticsearch