«Почему у нас уже нет приличной, похожей на Lucene Client Side (In-Browser) поисковой системы?»
Эта библиотека предоставляет функции полнотекстового поиска, подобные Lucene для браузера и Node.js.
В этой поисковой системе используются несколько расширенных алгоритмов для обеспечения надежного и эффективного поиска в большой коллекции документов. Используемые алгоритмы включают TF-IDF для взвешивания и ранжирования, BK-Tree для нечеткого соответствия, BM25 для оценки актуальности и расстояние Damerau-levenshtein для измерения расстояния редактирования между поисковыми терминами. Поисковая система поддерживает несколько языков и использует Stemming и удаление стоп -слов для повышения его эффективности. Он также поддерживает хранение и поиск метаданных, связанных с документами. Вы можете генерировать индекс из текстового корпуса и метаданных как на стороне клиента, так и на сервере. Вы можете увлажнить и повторно гидратировать (повторно использовать предварительно сгенерированный) индекс также на стороне клиента и сервера.
Я хочу использовать индекс, похожий на Lucene, который использует векторизацию TF-IDF, рейтинг BM25 и BKTree, а также снежный ком и остановки на стороне клиента.
Я хочу генерировать индекс поиска на стороне клиента или на стороне сервера (и повторно гидрата/повторно используйте его на клиенте или на стороне сервера). Информация о состоянии должна быть небольшой и сжатой.
Полнотекстовый поиск должен быть быстрым и эффективным, а не приводит к множеству ложноположительных или ложных негат.
Поисковая система должна быть в состоянии возвращать и искать в метаданных, которые могут быть связаны с каждым документом.
Поисковая система должна иметь возможность удалять/обновить документы INDEX.
Состояние должно быть увлажненным.
en , de , fr , es , ja8 KiB нано -размер (ESM, Gizpped, базовая библиотека)yarn add clientside-searchnpm install clientside-search import { SearchEngine } from 'clientside-search'
import en from 'clientside-search/en'
// create a new instance of a search engine
const searchEngine = new SearchEngine ( en )
// add some text
const docId1 = searchEngine . addDocument ( 'The quick brown fox jumps over the lazy dog' )
// you can also add UTF8 text, and metadata
const docId2 = searchEngine . addDocument ( 'The quick brown fox jumps over the fence ✅' , {
// metadata with index_ prefix will be indexed for search
index_title : 'Fence' ,
date : new Date ( ) ,
author : 'John Doe' ,
} )
/**
* {
* id:
* score: 1.34,
* metadata: { title: 'Fence', date: '2023-07-12 ...', author: 'John Doe' }
* }
*/
const searchResult = searchEngine . search ( 'Fence' )
// if you want to persist the index state,
// hydratedState is a JSON string that you can persist
const hydratedState = searchEngine . hydrateState ( )
// PLEASE NOTE: The hydrated state does NOT contain the original input text
// It contains an optimized representation of the search index
// However, metadata is kept 1:1
// you can re-hydrate from that state anywhere,
// on the server or the client:
const hydratedEngine = SearchEngine . fromHydratedState ( hydratedState , en )
// equals: searchResult
const searchResultFromHydated = hydratedEngine . search ( 'Fence' ) const { SearchEngine } = require ( 'clientside-search' )
const { en } = require ( 'clientside-search/en' )
// same API like ESM variant