MiniSearch
一个小巧但功能强大的内存全文搜索引擎,用 JavaScript的。它尊重资源,并且可以舒适地在两者中运行 节点和浏览器中。
最后更新时间:2023-12-05
搜索

MiniSearch 解决了需要全文搜索功能的用例 (例如前缀搜索、模糊搜索、排名、字段提升等),但数据 要编制索引的进程内存中可以本地放置。虽然你不会索引 有了整个互联网,就有了它,提供了令人惊讶的许多用例 好吧.通过将索引存储在本地内存中,可以 离线工作,可以快速处理查询,没有网络延迟。MiniSearchMiniSearch

一个突出的用例是在 Web 和移动设备中“边输入边输入”的实时搜索 应用程序,其中将索引保留在客户端上可实现快速响应 UI,无需向搜索服务器发出请求。

特征

  • 内存高效索引,旨在支持内存受限的用例 就像移动浏览器一样。
  • 精确匹配、前缀搜索、模糊匹配、字段提升。
  • 自动建议引擎,用于自动完成搜索查询。
  • 现代搜索结果排名算法。
  • 可以随时在索引中添加和删除文档。
  • 零外部依赖。

MiniSearch 努力公开一个简单的 API,该 API 为 构建自定义解决方案,同时保留一个小型且经过良好测试的代码库。

安装

npm

npm install minisearch

yarn

yarn add minisearch

然后在项目中:require import

import MiniSearch from 'minisearch'const MiniSearch = require('minisearch')

或者 CDN

<script src="https://cdn.jsdelivr.net/npm/minisearch@6.3.0/dist/umd/index.min.js"></script>

在这种情况下,将在项目中显示为全局变量。MiniSearch

最后,如果要手动构建库,请克隆存储库并运行(或对于缩小版本 + 源映射)。 编译后的源代码将在文件夹(UMD、ES6 和 ES2015 提供模块版本)

用法

基本用法

const documents = [
  {
    id: 1,
    title: 'Moby Dick',
    text: 'Call me Ishmael. Some years ago...',
    category: 'fiction'
  },
  {
    id: 2,
    title: 'Zen and the Art of Motorcycle Maintenance',
    text: 'I can see by my watch...',
    category: 'fiction'
  },
  // ...and more
]

let miniSearch = new MiniSearch({
  fields: ['title', 'text'], // fields to index for full-text search
  storeFields: ['title', 'category'] // fields to return with search results
})

// Index all documents
miniSearch.addAll(documents)

// Search with default options
let results = miniSearch.search('zen art motorcycle')
// => [
//   { id: 2, title: 'Zen and the Art of Motorcycle Maintenance', category: 'fiction', score: 2.77258, match: { ... } },
//   { id: 4, title: 'Zen and the Art of Archery', category: 'non-fiction', score: 1.38629, match: { ... } }
// ]

配置

MiniSearch 支持多个选项以实现更高级的搜索行为:

// Search only specific fields
miniSearch.search('zen', { fields: ['title'] })

// Boost some fields (here "title")
miniSearch.search('zen', { boost: { title: 2 } })

// Prefix search (so that 'moto' will match 'motorcycle')
miniSearch.search('moto', { prefix: true })

// Search within a specific category
miniSearch.search('zen', {
  filter: (result) => result.category === 'fiction'
})

// Fuzzy search, in this example, with a max edit distance of 0.2 * term length,
// rounded to nearest integer. The mispelled 'ismael' will match 'ishmael'.
miniSearch.search('ismael', { fuzzy: 0.2 })

// You can set the default search options upon initialization
miniSearch = new MiniSearch({
  fields: ['title', 'text'],
  searchOptions: {
    boost: { title: 2 },
    fuzzy: 0.2
  }
})
miniSearch.addAll(documents)

// It will now by default perform fuzzy search and boost "title":
miniSearch.search('zen and motorcycles')