Eine einfache Suchmaschinenimplementierung.
Studienzwecke, hauptsächlich zum Verständnis der Implementierungsdetails, wie Suchmaschinen erstellt werden, Leistungskompromisse und Struktur.
Die Idee besteht darin, eine isomorphe Anwendung von der Benutzeroberfläche auf das Datenbanksystem zu erstellen.
Die Anwendung kann entweder mit Docker oder der in Github veröffentlichten Binärdatei bereitgestellt werden.
./searchzin -c <path-to-config>.yml
Danach können Sie unter http://localhost:8080
nachsehen, um die Suchseite anzuzeigen.
Die Konfiguration kann entweder durch die Konfigurationsdatei vorgenommen werden, die sich standardmäßig in /etc/searchzin/config.yml
befindet, oder durch Bereitstellung von Konfigurationsschlüsseln in der Form -C key=value
, wobei die zweite Form die erste überschreibt.
Konfigurationsvorgaben:
port : 8080 # Service port
path :
log : /var/log/searchzin # Log directory
data : /var/lib/searchzin # Data directory
Die gesamte Projektstruktur wird in Golang unter Verwendung des gin
-Frameworks erstellt.
Abhängigkeiten werden mit dep
verwaltet.
Der größte Teil der Projekt-Toolchain wird vom Makefile
verwaltet. Die wichtigen Ziele sind:
install
: Erforderliche Abhängigkeiten und Git-Hooks installierenreadme
: Führt README.md
Einbindung von Dateien durchlint
: Führt Linting und Formatierung des Codes durchtest
: Nun, Unit-Tests kompilieren und ausführenbuild
: Erstellt einen verteilbaren linux
Ordner in dist
run
: Führt den Code mit go run
ausrun-dev
: Erstellt einen Docker-Container und führt ihn ausrelease
: Erstellt ein Release-Docker-Imagepublish
: Veröffentlicht das Docker-Image auf Dockerhub unter Verwendung des Inhalts der VERSION
Datei als Versionpublish-latest
: Veröffentlicht das Docker-Image auf Dockerhub mit dem latest
Tagwatch
: Führt lint
und test
bei Dateiänderungen durchfunc-test
: Führt Funktionstests im features
-Ordner durch Diese Suchmaschine besteht aus 6 Hauptkomponenten:
Jede Komponente hat eine klare Verantwortung im System und alle arbeiten zusammen, um auf Anfragen und Dokumentenindizierungsanforderungen zu reagieren.
Es ist dafür verantwortlich, neu erstellte Dokumente zu speichern und mit IDs zu versehen. Die Einschränkungen sind:
id
id
Generierung ohne Kollisionen für die Persistenzssd
oder hdd
Speichert einen umgekehrten Index von „Begriffen“ und Dokumenten
terms
zu Dokumentensatzbeziehungenkey
für Abfragen mit Keyword-AnnäherungVorausgesetzt, ein neues Dokument versteht es und speichert es sowohl in der Indexdatenbank als auch in der Dokumentendatenbank.
Analysiert die Benutzereingaben und wandelt sie mithilfe einer baumartigen Datenstruktur in einen Abfrageplan um.
lucene
ähnelnOptimiert einen gegebenen Abfragebaum unter Berücksichtigung der Einschränkungen und der Umgebung, in der er ausgeführt wird.
Nach einem strukturierten Plan ruft die Abfrage dann effektive Daten aus der index
ab. Dieser Schritt wird vom Ausführenden ausgeführt.
Diese Abfragesprache basiert stark auf der von Lucene, um das Design zu vereinfachen und zu verstehen, welche Kompromisse eingegangen wurden.
Das aktuelle Testszenario, das verwendet wird, ist die Indizierung von Podcasts nach Name, Inhalt und Tags.
Die Basisverwendung finden Sie in searchzin-example
.
searchzin ist unter der MIT-Lizenz verfügbar.