ndx
1.0.0
軽量のフルテキストインデックス作成と検索ライブラリ。
このライブラリは、すべてのドキュメントがディスク(indexedDB)に保存され、動的に追加またはインデックスに削除できる場合、特定のユースケース用に設計されています。
クエリ関数は、分離演算子のみをサポートします。 one two
のようなクエリは"one" or "two"
として機能します。
反転インデックスは用語の場所を保存せず、クエリ関数は"Super Mario"
などのフレーズを検索できません。
さまざまなトレードオフを持つ多くの代替ソリューションがあり、特定のユースケースにより適している可能性があります。静的データセットを使用した簡単なドキュメント検索の場合、FSTのようなものを使用して、エッジ関数(WASM)として展開することをお勧めします。
import { createIndex , indexAdd } from "ndx" ;
import { indexQuery } from "ndx/query" ;
const termFilter = ( term ) => term . toLowerCase ( ) ;
function createDocumentIndex ( fields ) {
// `createIndex()` creates an index data structure.
// First argument specifies how many different fields we want to index.
const index = createIndex (
fields . length ,
// Tokenizer is a function that breaks text into words, phrases, symbols,
// or other meaningful elements called tokens.
( s ) => s . split ( " " ) ,
// Filter is a function that processes tokens and returns terms, terms are
// used in Inverted Index to index documents.
termFilter ,
) ;
// `fieldGetters` is an array with functions that will be used to retrieve
// data from different fields.
const fieldGetters = fields . map ( ( f ) => ( doc ) => doc [ f . name ] ) ;
// `fieldBoostFactors` is an array of boost factors for each field, in this
// example all fields will have identical weight.
const fieldBoostFactors = fields . map ( ( ) => 1 ) ;
return {
index ,
// `add()` will add documents to the index.
add ( doc ) {
indexAdd (
index ,
fieldGetters ,
// Docum ent key, it can be an unique document id or a refernce to a
// document if you want to store all documents in memory.
doc . id ,
// Document.
doc ,
) ;
} ,
// `remove()` will remove documents from the index.
remove ( id ) {
// When document is removed we are just marking document id as being
// removed. Index data structure still contains references to the removed
// document.
indexRemove ( index , removed , id ) ;
if ( removed . size > 10 ) {
// `indexVacuum()` removes all references to removed documents from the
// index.
indexVacuum ( index , removed ) ;
}
} ,
// `search()` will be used to perform queries.
search ( q ) {
return indexQuery (
index ,
fieldBoostFactors ,
// BM25 ranking function constants:
// BM25 k1 constant, controls non-linear term frequency normalization
// (saturation).
1.2 ,
// BM25 b constant, controls to what degree document length normalizes
// tf values.
0.75 ,
q ,
) ;
}
} ;
}
// Create a document index that will index `content` field.
const index = createDocumentIndex ( [ { name : "content" } ] ) ;
const docs = [
{
"id" : "1" ,
"content" : "Lorem ipsum dolor" ,
} ,
{
"id" : "2" ,
"content" : "Lorem ipsum" ,
}
] ;
// Add documents to the index.
docs . forEach ( ( d ) => { index . add ( d ) ; } ) ;
// Perform a search query.
index . search ( "Lorem" ) ;
// => [{ key: "2" , score: ... }, { key: "1", score: ... } ]
//
// document with an id `"2"` is ranked higher because it has a `"content"`
// field with a less number of terms than document with an id `"1"`.
index . search ( "dolor" ) ;
// => [{ key: "1", score: ... }]
ndx
ライブラリは、トークナーやフィルターを提供していません。たとえば、Tokenizersを実装する他のライブラリがあります。たとえば、The Naturalにはトークン剤とステマーの良いコレクションがあります。
mit