Une implémentation simple d'un moteur de recherche.
Objectifs d'étude, principalement pour comprendre les détails de mise en œuvre de la façon dont les moteurs de recherche sont créés, les compromis en matière de performances et la structure.
L'idée est de réaliser une application isomorphe de l'interface utilisateur au système de base de données.
L'application peut être déployée à l'aide de Docker ou du binaire publié sur github.
./searchzin -c <path-to-config>.yml
Après cela, vous pouvez consulter http://localhost:8080
pour voir la page de recherche.
La configuration peut être effectuée soit par le fichier de configuration situé par défaut dans /etc/searchzin/config.yml
, soit en fournissant des clés de configuration sous la forme -C key=value
, la deuxième forme remplace la première.
Paramètres par défaut :
port : 8080 # Service port
path :
log : /var/log/searchzin # Log directory
data : /var/lib/searchzin # Data directory
Toute la structure du projet est réalisée en golang, en utilisant le framework gin
.
Les dépendances sont gérées à l'aide dep
.
La majeure partie de la chaîne d'outils du projet est gérée par le Makefile
, les cibles importantes sont :
install
: Installer les dépendances nécessaires et les hooks gitreadme
: effectue l'inclusion des fichiers README.md
lint
: Effectue le peluchage et le formatage du codetest
: Eh bien, compilez et exécutez des tests unitairesbuild
: Crée un dossier distribuable linux
dans dist
run
: Exécute le code en utilisant go run
run-dev
: crée et exécute un conteneur Dockerrelease
: Crée une image Docker de versionpublish
: publie l'image docker sur dockerhub en utilisant le contenu du fichier VERSION
comme versionpublish-latest
: Publie l'image docker sur dockerhub avec la latest
balisewatch
: Effectue lint
et test
sur la modification de fichiersfunc-test
: effectue des tests fonctionnels dans le dossier features
Il y a 6 composants principaux dans ce moteur de recherche :
Chaque composant a une responsabilité claire dans le système, et tous travaillent ensemble pour répondre aux requêtes et aux demandes d'indexation de documents.
Il est responsable de stocker et de donner des identifiants aux documents nouvellement créés. Les contraintes sont :
id
id
sans collision pour la persistancessd
ou hdd
Stocke un index inversé des « termes » et des documents
terms
pour documenter les relations définieskey
pour les requêtes avec approximation de mots clésÉtant donné qu'un nouveau document le comprend et l'enregistre à la fois dans la base de données d'index et dans la base de données de documents.
Analyse l'entrée de l'utilisateur et la transforme en plan de requête à l'aide d'une structure de données arborescente.
lucene
Étant donné un arbre de requête, l'optimise en étant conscient des restrictions et de l'environnement dans lequel il sera exécuté.
Après avoir un plan structuré, la requête récupère ensuite les données effectives de la base de données index
, cette étape est effectuée par l'exécuteur.
Ce langage de requête est fortement basé sur celui de Lucene, pour simplifier la conception et comprendre les compromis qui ont été faits.
Le scénario de test actuel qui sera utilisé consistera à indexer les podcasts par nom, contenu et balises.
L'utilisation de base peut être trouvée dans searchzin-example
.
searchzin est disponible sous la licence MIT.