Un moteur de recherche basé sur Tantivy pour 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 Un script postinstall essaie automatiquement de télécharger un binaire précompilé pour la partie Rust / Tantivy. En cas d'échec, le script essaiera de le compiler si une chaîne d'outils de rouille est présente.
const IndexCatalog = require ( '@arso-project/sonar-tantivy' ) const catalog = new IndexCatalog(storage) storage est un chemin de système de fichiers où l'index sera stocké.
const index = await catalog.openOrCreate(indexName, schema) indexName est une chaîne pour identifier l'index. Il ne doit contenir que des caractères valides dans les chemins de système de fichiers. schema est le schéma d'index, exprimé comme un objet SERIALISABLE JSON suivant la définition du schéma Tantivy. La documentation n'est pas centralisée ATM, voir l'exemple ci-dessus.
const index = await catalog.create(indexName, schema, opts) Créer un index. Jetera si un index par ce indexName existe déjà. opts sont:
ram : Si vrai, créez un index en mémoire await index.add(docs) docs est un tableau de documents avec la même structure que le schéma d'index.
const results = await index.query(query, [limit], [snippetField]) Interroger l'index. À l'heure actuelle, seules les requêtes de chaîne sont prises en charge, voir Tantivy Docs pour plus de détails sur la grammaire prise en charge. limit est le nombre maximum de documents à retourner (par défaut 10). snippetField est le nom d'un champ pour lequel retourner un extrait de résultat avec des mots clés mis en surbrillance (comme HTML, avec <b> balises)
const results = await catalog.multiQuery(query, indexes) Interrogez tous les index dans le catalogue. indexes sont un tableau de noms d'index.
Être élargi
La partie de la rouille est un emballage autour de Tantivy. Il se compile en binaire. Le binaire est invoqué avec un chemin de stockage comme seul argument. Il écoute les messages JSON délimités à Newline sur STDIN et répond dans le même format.
La partie de nœud engendre le binaire de la rouille et communique sur le tuyau STdio. Il ajoute une API de niveau supérieur autour de ce simple mécanisme RPC.
Une étape postinstall NPM tentera de télécharger un binaire précompilé de la partie de la rouille des versions GitHub. Les binaires sont compilés et déployés via Travis. S'il ne peut pas trouver de binaire assorti, il essaiera de compiler si une chaîne d'outils de rouille est disponible. Si la variable d'environnement RUST_ENV=development est présente, cargo run (sans --release ) sera invoquée à la place.