CompleteSearch ist eine schnelle und interaktive Suchmaschine für die kontextsensitive Präfixsuche in einer bestimmten Sammlung von Dokumenten. Sie liefert nicht nur Suchergebnisse, wie eine normale Suchmaschine, sondern auch Vervollständigungen für das letzte (vielleicht nur teilweise eingegebene) Suchwort, das zu einem Treffer führt. Dies kann verwendet werden, um eine Vielzahl von Funktionen sehr effizient zu unterstützen: automatische Abfragevervollständigung, Facettensuche, Synonymsuche, fehlertolerante Suche, semantische Suche. Am Ende dieser Seite finden Sie eine Liste von Veröffentlichungen zu den Techniken hinter CompleteSearch und seinen zahlreichen Anwendungen.
Für eine Demo zu verschiedenen Datensätzen schauen Sie sich einfach dieses Repository an und befolgen Sie die nachstehenden Anweisungen. Mit einer einzigen Befehlszeile erhalten Sie eine funktionierende Demo (Sie können aus mehreren Datensätzen auswählen, von denen jeder die Größe von einigen Millionen Dokumenten hat, also nicht besonders groß, aber auch nicht klein). CompleteSearch lässt sich auf Sammlungen mit Dutzenden oder sogar Hunderten Millionen Dokumenten skalieren, ohne seine Interaktivität zu verlieren.
Checken Sie das Repository aus und erstellen Sie das Docker-Image
git clone https://github.com/ad-freiburg/completesearch
cd completesearch
docker build -t completesearch .
Die folgende Befehlszeile erstellt einen Suchindex und startet dann den Suchserver für den über die DB
Variable angegebenen Datensatz (der Name eines beliebigen Unterverzeichnisses von Anwendungen funktioniert). Unter dem angegebenen PORT
verfügen Sie dann über eine generische Benutzeroberfläche sowie eine API (siehe Abschnitt 4 unten).
export DB=movies && PORT=1622 && docker run -it --rm -e DB=${DB} -p ${PORT}:8080 -v $(pwd)/applications:/applications -v $(pwd)/data/:/data -v $(pwd)/ui:/ui --name completesearch.${DB} completesearch -c "make DATA_DIR=/data/${DB} DB=${DB} csv pall start"
Diese Befehlszeile lädt die CSV-Datei herunter, dekomprimiert sie, erstellt den Index und startet den Server – alles in einem Rutsch. Wenn Sie die CSV bereits heruntergeladen haben, wird sie nicht erneut heruntergeladen (das Makefile-Ziel csv:
hat dann keine Wirkung). Wenn Sie den Index bereits einmal erstellt haben, können Sie das Makefile-Ziel pall:
(was für precompute all steht) weglassen.
Lesen Sie diesen Abschnitt, wenn Sie etwas tiefer verstehen möchten, was mit der schicken Befehlszeile oben passiert. Die Befehlszeile erstellt zunächst ein Docker-Image aus dem Code in diesem Repository. So weit, ist es gut. Anschließend wird ein Docker-Container ausgeführt, der drei Volumes bereitstellt, die wir im Folgenden kurz erläutern:
Anwendungen Dieser Ordner enthält die Konfiguration für jede Anwendung. Jede Konfiguration enthält lediglich zwei Dateien. Ein Makefile
, das angibt, wie der Index erstellt wird (dies ist in hohem Maße anpassbar, siehe unten). Und eine config.js
zum Anpassen der generischen Benutzeroberfläche.
data Dieser Ordner enthält die CSV-Datei mit den Originaldaten (ein Datensatz pro Zeile, in Spalten) und die Indexdateien. Sie alle haben ein gemeinsames Präfix. Weitere Informationen zum Index finden Sie weiter unten.
ui Dieser Ordner enthält den Code für die generische Benutzeroberfläche. Wenn Sie CompleteSearch nur als Backend verwenden und Ihre eigene Benutzeroberfläche erstellen möchten, müssen Sie dieses Volume nicht mounten. Es ist jedoch schön, immer eine funktionierende Benutzeroberfläche zum Testen zur Verfügung zu haben, ohne dass zusätzliche Arbeit erforderlich ist.
Wie alle Suchmaschinen baut CompleteSearch einen Index auf, mit dessen Hilfe es dann Anfragen effizient beantworten kann. Es handelt sich nicht um einen gewöhnlichen invertierten Index, sondern um etwas Ausgefalleneres: einen halbinvertierten Index oder Hybird-Index (HYB) . Sie müssen dies nicht verstehen, wenn Sie nur CompleteSearch verwenden möchten. Wenn Sie jedoch interessiert sind, können Sie in den folgenden Veröffentlichungen mehr darüber erfahren.
Um den Index zu erstellen, benötigt CompleteSearch zwei Eingabedateien, eine mit dem Suffix .words
und eine mit dem Suffix .docs
. Die erste enthält den Inhalt Ihrer Dokumente, aufgeteilt in Wörter. Die zweite enthält die Daten, die Sie als Suchmaschinentreffer anzeigen möchten. Die beiden hängen normalerweise zusammen, sind aber nicht genau dasselbe. Das Format ist sehr einfach und wird hier anhand eines Beispiels beschrieben.
Wenn Sie spezielle Wünsche haben, können Sie diese beiden Eingabedateien selbst erstellen, unabhängig von Ihren Daten. Dann haben Sie die volle Kontrolle darüber, was CompleteSearch für Sie tun wird und kann. In den meisten Anwendungen können Sie jedoch unseren generischen CSV-Parser verwenden. Es nimmt eine CSV-Datei (ein Datensatz pro Zeile, mit einer festen Anzahl von Spalten pro Zeile) als Eingabe und erstellt daraus die .words- und die .docs- Datei.
Die CSV-Analyse ist sehr leistungsstark und hochgradig anpassbar. Wie es verwendet wird, können Sie im Makefile der verschiedenen Beispielanwendungen (in den Unterverzeichnissen des Verzeichnisse applications
) sehen. Eine Teilmenge der Optionen wird hier ausführlicher beschrieben. Eine vollständige Liste finden Sie im Code, der die Optionen analysiert.
Die Binärdatei zum Starten der CompleteSearch-Engine heißt startCompletionServer
. Es ist sehr leistungsstark und bietet viele Optionen. Für einige Anwendungsbeispiele können Sie sich das Makefile
in den Director applications
und das enthaltene Makefile
einer der Beispielanwendungen ansehen. Eine ausführliche Dokumentation aller Optionen finden Sie in der README.md im src-Verzeichnis.
Sobald Sie gestartet sind, können Sie entweder über unsere generische und anpassbare Benutzeroberfläche Fragen stellen (siehe oben). Oder Sie können das Backend direkt über die von startCompletionServer
bereitgestellte HTTP-API fragen. Die API ist sehr einfach und wird am Ende dieser Seite beschrieben. Spielen Sie mit Beispielanwendungen herum, um ein Gefühl dafür zu bekommen, was es bewirkt. Sie können sich auch den (eher einfachen) JavaScript-Code der generischen Benutzeroberfläche ansehen, um ein Gefühl dafür zu bekommen, wie er funktioniert und wofür er verwendet werden kann.
Um Ihre CompleteSearch-Instanz Ihren Freunden zu präsentieren, möchten Sie möglicherweise, dass sie unter einer ausgefallenen URL ausgeführt wird und nicht http://my.weird.hostname.somewhere:76154
. Nehmen wir an, dass auf Ihrem Rechner ein Apache-Webserver läuft. Anschließend können Sie den folgenden Abschnitt in Ihre apache.conf
oder in eine separate Konfigurationsdatei einfügen, die in der apache.conf
enthalten ist. Sie müssen servername
durch den vollqualifizierten Domänennamen (FQDN) des Rechners ersetzen, auf dem Ihr Apache-Webserver läuft. Sie müssen hostname
durch den FQDN des Computers ersetzen, auf dem das CompleteSearch-Frontend ausgeführt wird. Dies kann derselbe Computer wie servername
sein, muss aber nicht.
< VirtualHost *:80>
ServerName example.cs.uni-freiburg.de
ServerAlias dblp example.cs.uni-freiburg.de
ServerAdmin webmaster@localhost
ProxyPreserveHost On
ProxyRequests Off
ProxyPass / http://< hostname >:5000/
ProxyPassReverse / http://< hostname >:5000>/
...
</ VirtualHost >
Hier finden Sie einige Veröffentlichungen, in denen die Techniken hinter CompleteSearch und seine Einsatzmöglichkeiten erläutert werden. Diese Arbeit wurde am Max-Planck-Institut für Informatik durchgeführt. Es ist schon eine Weile her, aber es zeigt sich, dass die Funktionen und die Effizienz von CompleteSearch immer noch auf dem neuesten Stand der Technik sind.
Weniger eingeben, mehr finden: Schnelle Autovervollständigung mit einem prägnanten Index @ SIGIR 2006
Die komplette Suchmaschine: Interaktiv, effizient und auf dem Weg zur IR- und DB-Integration @ CIDR 2007
ESTER: Effiziente Suche nach Text, Entitäten und Beziehungen @ SIGIR 2007
Effiziente interaktive Abfrageerweiterung mit vollständiger Suche @ CIKM 2007
Ausgabesensitive Autovervollständigungssuche @ Information Retrieval 2008
Semantische Volltextsuche mit ESTER: Skalierbar, einfach, schnell @ ICDM 2008