基于 js-search 的全文客户端搜索,但添加了 Web Worker 支持以获得更好的性能。
查看 redux-search 的集成示例。
或者使用 NPM 自行安装:
npm install --save js-worker-search
该实用程序从 JS 搜索派生出来,构建搜索索引并运行实际搜索。它自动检测当前环境(浏览器或节点)的功能,并在可能的情况下使用基于 web-worker 的实现。当没有可用的 Web Worker 支持时,搜索将在主 (UI) 线程上完成。
SearchApi 定义了以下公共方法:
constructor ({ caseSensitive, indexMode, tokenizePattern })
默认情况下, SearchApi
会构建一个索引来匹配所有子字符串。您可以通过传递命名的indexMode
参数来覆盖此行为。有效值为INDEX_MODES.ALL_SUBSTRINGS
、 INDEX_MODES.EXACT_WORDS
和INDEX_MODES.PREFIXES
。
默认情况下,搜索不区分大小写,并根据所有空白字符进行分割。请阅读下文,了解有关自定义默认选项的更多信息。
indexDocument (uid, text)
在搜索索引中添加或更新 uid 并将其与指定文本关联。注意,此时只能在索引中添加或更新uid,而不能删除。
参数:
search(query)
在当前索引中搜索指定的查询文本。仅接受与文本中所有单词匹配的 uid。如果提供空查询字符串,则将返回所有索引的 uid。
文档搜索不区分大小写(例如“搜索”将匹配“搜索”)。文档搜索使用子字符串匹配(例如“na”和“me”都将匹配“name”)。
参数:
该方法将返回一个 uid 数组。
terminate()
如果搜索正在 Web Worker 中运行,这将终止该 Worker 以允许垃圾回收。
像这样使用 API:
import SearchApi from 'js-worker-search'
const searchApi = new SearchApi ( )
// Index as many objects as you want.
// Objects are identified by an id (the first parameter).
// Each Object can be indexed multiple times (once per string of related text).
searchApi . indexDocument ( 'foo' , 'Text describing an Object identified as "foo"' )
searchApi . indexDocument ( 'bar' , 'Text describing an Object identified as "bar"' )
// Search for matching documents using the `search` method.
// In this case the promise will be resolved with the Array ['foo', 'bar'].
// This is because the word "describing" appears in both indices.
const promise = searchApi . search ( 'describing' )
默认情况下, SearchApi
会构建一个索引来匹配所有子字符串。您可以通过将indexMode
参数传递给构造函数来覆盖此行为,如下所示:
import SearchApi , { INDEX_MODES } from 'js-worker-search'
// all-substrings match by default; same as current
// eg "c", "ca", "a", "at", "cat" match "cat"
const searchApi = new SearchApi ( )
// prefix matching (eg "c", "ca", "cat" match "cat")
const searchApi = new SearchApi ( {
indexMode : INDEX_MODES . PREFIXES
} )
// exact words matching (eg only "cat" matches "cat")
const searchApi = new SearchApi ( {
indexMode : INDEX_MODES . EXACT_WORDS
} )
默认情况下, SearchApi
使用空格和换行符作为分隔字符将文本分解为单词(标记化)。如果您想提供自己的分割规则,请将 RegExp 传递给定义模式的构造函数,如下所示:
// Custom tokenizer pattern to include all non alphanumerics as delimeters
// ex: searching "Swift" matches "Thomas Swift" and "Thomas (Swift)" but not "swiftly tilting"
const searchApi = new SearchApi ( {
indexMode : INDEX_MODES . EXACT_WORDS ,
tokenizePattern : / [^a-z0-9]+ / ,
} )
默认的清理程序执行不区分大小写的搜索。如果您想覆盖该行为并执行区分大小写的搜索,请将 caseSensitive 位设置为 true,如下所示:
// custom sanitizer for case-sensitive searches
const searchApi = new SearchApi ( {
caseSensitive : true
} )
默认情况下,搜索实用程序仅返回包含每个搜索标记的文档。它可以配置为返回包含任何搜索标记的文档。
// Change search behavior from AND to OR
const searchApi = new SearchApi ( {
matchAnyToken : true
} )
更改在更改日志中进行跟踪。
js-worker-search 可在 MIT 许可证下使用。