Ein Spaßprojekt zum Schreiben einer kleinen, naiven Suchmaschine, die für Small Data™ geeignet ist.
Führen Sie Unit-Tests durch:
mix test --exclude external
Führen Sie alle Tests durch, auch solche, die auf externen Diensten basieren. Wie zum Beispiel die RedisIndex
-Tests:
mix test
Stellen Sie sicher, dass Sie in config/config.exs die richtige Verbindungszeichenfolge für Redis haben . Sie können docker-compose
verwenden, um eine Redis-Instanz schnell zum Laufen zu bringen.
Jeder Index in Cedrik wird durch einen Prozess mit dem Index
@behaviour
repräsentiert. Um etwas in einen Index zu indizieren, rufen Sie einfach Index.index_doc(something, :index_name, type)
auf, wobei something
eine Elixir-Map oder -Struktur wäre (ich würde empfehlen, eine Struktur mit einem ID-Feld zu erstellen, das das Storable
-Protokoll implementiert – schauen Sie sich das an lib/document.ex
und lib/agent_store.ex
als Referenz), type
muss eine der vorhandenen Indeximplementierungen AgentIndex
oder RedisIndex
sein. Das letzte Argument für Index.index_doc
ist optional und lautet standardmäßig AgentIndex
.
Um eine Liste vorhandener Indizes zu erhalten, verwenden Sie Index.list/0
oder Index.list/1
– diese geben eine Liste von Tupeln im Format {pid, name, module}
zurück.
Dies ist der naive In-Memory-Indextyp, der für Dinge geeignet ist, die in den Speicher passen und nicht dauerhaft gespeichert werden müssen.
Dies ist ein von Redis unterstützter Index. Damit dies funktioniert, muss eine Redis-Instanz aktiv sein. Der Hauptvorteil der Verwendung eines RedisIndex im Vergleich zu AgentIndex besteht darin, dass Sie Daten dauerhaft speichern möchten.
Im Moment ist ein Token einfach eine beliebige durch Leerzeichen getrennte Zeichenfolge.
Verwenden Sie Search.search(query_struct, [:index1, :index2])
, Beispiele finden Sie test/e2e_test.exs
und test/query_test.exs
.
Um eine query_struct
zu erhalten, die Cedrik versteht, gibt es einen einfachen (und unvollständigen) Parser für Strings: Query.Parse.parse/1
. Es werden Zeichenfolgen tokenisiert und dann entsprechend Term- und Wildcard-Abfragestrukturen erstellt. Begriffe und Platzhalter werden im Feld „Must“ in einen booleschen Wert eingeschlossen.
Diese Abfrage gibt alle Dokument-IDs in den angegebenen Indizes zurück.
Eine TermQuery gibt einfach die Dokument-IDs (und die Positionen des Begriffs innerhalb dieses Dokuments) zurück, die den angegebenen Begriff enthalten. Sie können genau angeben, in welchen Feldern gesucht werden soll, oder in allen (Standardeinstellung).
Mit der BooleanQuery können Sie komplexere Abfragen erstellen. must
, optional
und must_not
Diese Abfrage kann Ihnen helfen, Ihre Treffer zu erweitern. Eine Wildcard-Abfrage mit dem Wert "foo*"
stimmt beispielsweise sowohl mit „foo“ als auch mit „foobar“ überein. Beachten Sie, dass derzeit nur einzelne Platzhalter unterstützt werden, entweder führende ( *foo
) oder nachgestellte ( foo*
)
Im Moment erhalten Sie in den Ergebnissen von Search.search/2
eine Liste von Tupeln, die wie folgt aussehen: {doc_id, #MapSet<[%Location{field: :field, position: x}]>}
sortiert nach den Inhalten mit den meisten Treffern Erste.