Eine tantivy basierte Suchmaschine für Node.js
const IndexCatalog = require ( '@arso-project/sonar-tantivy' )
( async function ( ) {
const catalog = new IndexCatalog ( './data' )
const schema = getSchema ( )
const index = await catalog . openOrCreate ( 'index-name' , schema )
const docs = getDocs ( )
await index . add ( docs )
const results = await index . query ( 'world' )
console . log ( 'query results' , results )
} ) ( )
function getDocs ( ) {
return [
{ id : '0' , title : 'Hello world!' , body : 'tell me more' } ,
{ id : '1' , title : 'Ola mundo!' , body : 'que pasa pues' }
]
}
function getSchema ( ) {
return [
{
name : 'title' ,
type : 'text' ,
options : {
indexing : { record : 'position' , tokenizer : 'en_stem' } ,
stored : true
}
} ,
{
name : 'body' ,
type : 'text' ,
options : {
indexing : { record : 'position' , tokenizer : 'en_stem' } ,
stored : true
}
} ,
{
name : 'id' ,
type : 'text' ,
options : { indexing : null , stored : true }
} ,
]
} npm install @arso-project/sonar-tantivy Ein postinstall -Skript versucht automatisch, eine vorkompilierte Binärdatei für den Rost/Tantivy -Teil herunterzuladen. Wenn das Skript nicht erfolgreich ist, versucht es, es zu kompilieren, wenn eine Rost -Toolchain vorhanden ist.
const IndexCatalog = require ( '@arso-project/sonar-tantivy' ) const catalog = new IndexCatalog(storage) storage ist ein Dateisystempfad, auf dem der Index gespeichert wird.
const index = await catalog.openOrCreate(indexName, schema) indexName ist eine Zeichenfolge, die den Index identifiziert. Es sollte nur Zeichen enthalten, die in Dateisystempfaden gültig sind. schema ist das Indexschema, das nach der Tantivy-Schema-Definition als JSON-serialisierbares Objekt ausgedrückt wird. Die Dokumentation ist kein zentraler Geldautomaten, siehe Beispiel oben.
const index = await catalog.create(indexName, schema, opts) Erstellen Sie einen Index. Wird werfen, wenn ein Index durch diesen indexName bereits existiert. opts sind:
ram : Wenn True einen In-Memory-Index erstellen await index.add(docs) docs ist eine Reihe von Dokumenten mit der gleichen Struktur wie das Indexschema.
const results = await index.query(query, [limit], [snippetField]) Fragen Sie den Index ab. Im Moment werden nur String -Abfragen unterstützt. Weitere Informationen zur unterstützten Grammatik finden Sie in Tantivy Docs. limit ist die maximale Anzahl von Dokumenten, die zurückgegeben werden sollen (Standard 10). snippetField ist der Name eines Feldes, auf dem ein Ergebnis Snippet mit hervorgehobenen Schlüsselwörtern zurückgegeben werden soll (als HTML, mit <b> Tags)
const results = await catalog.multiQuery(query, indexes) Fragen Sie alle Indizes im Katalog ab. indexes ist eine Reihe von Indexnamen.
Erweitert werden
Der Rostteil ist ein Wrapper um Tantivy. Es kompiliert ein binäres. Die Binärdatei wird mit einem Speicherpfad als nur Argument angerufen. Es hört auf Newline-delimitierte JSON-Nachrichten auf Stdin und antwortet im selben Format.
Der Knotenteil erzeugt den rostbinären und kommuniziert über das Stdio -Rohr. Es fügt eine API auf höherer Ebene um diesen einfachen RPC-Mechanismus hinzu.
Mit einem NPM postinstall wird versucht, eine vorkompilierte Binärdatei des Rostteils aus Github -Releases herunterzuladen. Die Binärdateien werden über Travis zusammengestellt und bereitgestellt. Wenn es keine passende Binärdatum finden kann, versucht es zu kompilieren, wenn eine Rost -Toolchain verfügbar ist. Wenn die Umgebungsvariable RUST_ENV=development vorhanden ist, wird stattdessen cargo run (ohne --release ) aufgerufen.