简介

本项目是基于 js 库开源库 FlexSearch  进行移植的 OpenHarmony 适配版本。

FlexSearch 是一个快速、零依赖的全文搜索库。 在原始搜索速度方面,FlexSearch 优于每一个搜索库, 并提供灵活的搜索功能,如多字段搜索,语音转换或部分匹配。根据使用的选项,它还提供最高内存效率的索引。 FlexSearch 引入了一种新的评分算法,称为“上下文索引”,基于预先评分的词典字典体系结构,与其它库相比,实际执行的查询速度有大幅度提高。 FlexSearch 还为您提供非阻塞异步处理模型,以通过专用平衡线程并行地对索引执行任何更新或查询。

下载安装


ohpm install @ohos/flexsearch

使用说明

快速接入

单字段检索使用 Index 更简单,多字段检索使用 Document,以 Document 为例


import FlexSearch, { StoreOption, IndexOptionsForDocumentSearch } from "@ohos/flexsearch"; import docs, { DocsDataType } from './docsData'; // DocsDataType是自定义的多字段数据类型,详情参考entry/src/main/ets/model/docsModel.ets const options: IndexOptionsForDocumentSearch<DocsDataType, StoreOption> = { // 中文检索需要使用CJK编码方式或自定义 charset: "cjk", document: { id: "url", tag: "tag", index: ["title", "content"], store: ["url", "title"], } } const index = new FlexSearch.Document(options); // DocsDataType数据类型可参考entry/src/main/ets/model/docsData.ets const doc1 = new DocsDataType( "url1", "流行病", "流行病波及8省份!疾控专家提醒冬季流行病 ...", "大象新闻消息,仅三天时间,已经 ... 10月18日,陕西省卫健委通报..." ); index.add(doc1); let result = index.search("流行病", { limit: 100, offset: 0, suggest: false, index: ["title", "content"], tag: false, enrich: false, bool: "or", }); // 异步版本搜索方法callback方式 index.searchAsync( "流行病", { limit: 100, offset: 0, suggest: false, index: ["title", "content"], tag: false, enrich: false, bool: "or", }, function (result) { console.log(result); } ); // 异步版本搜索方法promise方式 index .searchAsync("流行病", { limit: 100, offset: 0, suggest: false, index: ["title", "content"], tag: false, enrich: false, bool: "or", }) .then(function (result) { console.log(result); }); // async await方式 async function search() { const results = await index.searchAsync("流行病", { limit: 100, offset: 0, suggest: false, index: ["title", "content"], tag: false, enrich: false, bool: "or", }); console.log(result); }

API 预览

Global Methods:

  • FlexSearch.registerCharset(name, charset)(id, string)*
  • FlexSearch.registerLanguage(name, language) *

Index Methods:

  • Index.add(id, string) *
  • Index.append(id, string) *
  • Index.update(id, string) *
  • Index.remove(id) *
  • Index.search(string, , ) *
  • Index.search(options) *
  • async Index.export(handler)
  • async Index.import(key, data)

WorkerIndex Methods:

  • async Index.add(id, string)
  • async Index.append(id, string)
  • async Index.update(id, string)
  • async Index.remove(id)
  • async Index.search(string, , )
  • async Index.search(options)
  • async Index.export(handler) (WIP)
  • async Index.import(key, data) (WIP)

Document Methods:

  • Document.add(, document) *
  • Document.append(, document) *
  • Document.update(, document) *
  • Document.remove(id || document) *
  • Document.search(string, , ) *
  • Document.search(options) *
  • async Document.export(handler)
  • async Document.import(key, data)

* 表示此方法存在一个等价的异步方法

Async Version:

  • async .addAsync( ... , )
  • async .appendAsync( ... , )
  • async .updateAsync( ... , )
  • async .removeAsync( ... , )
  • async .searchAsync( ... , )

异步方法会返回一个 Promise, 或者,您可以将回调函数作为最后一个参数传递.

方法exportimport始终是异步的,您在基于 Worker 的索引上调用的每个方法也都是异步的.

DD一下:欢迎大家关注工粽号<程序猿百晓生>,可以了解到以下知识点。

`欢迎大家关注工粽号<程序猿百晓生>,可以了解到以下知识点学习。` 1.OpenHarmony开发基础 2.OpenHarmony北向开发环境搭建 3.鸿蒙南向开发环境的搭建 4.鸿蒙生态应用开发白皮书V2.0 & V3.0 5.鸿蒙开发面试真题(含参考答案) 6.TypeScript入门学习手册 7.OpenHarmony 经典面试题(含参考答案) 8.OpenHarmony设备开发入门【最新版】 9.沉浸式剖析OpenHarmony源代码 10.系统定制指南 11.【OpenHarmony】Uboot 驱动加载流程 12.OpenHarmony构建系统--GN与子系统、部件、模块详解 13.ohos开机init启动流程 14.鸿蒙版性能优化指南 .......

worker 功能使用说明

单字段检索使用使用 worker 功能需用 FlexSearch.Worker 代替 FlexSearch.Index 由于线程间数据传递序列化问题,charset 对象里的 encode 属性(value 为 function)会被忽略,此时需将 charset 对象拆分传递,并且将 charset.encode 做个特殊处理,不传递 function 改为传递 function.name


import FlexSearch from "@ohos/flexsearch"; import charsetDefault from "@ohos/flexsearch/src/lang/latin/default.js"; const index = new FlexSearch.Worker({ encode: charsetDefault.encode.name, tokenize: charsetDefault.tokenize, rtl: charsetDefault.rtl, });

然后 entry 工程目录里,与 pages 目录同级创建 workers 目录,然后在 workers 目录里新建 worker.js 文件


// worker.js import charsetDefault from "@ohos/flexsearch/src/lang/latin/default.js"; import { setEncode, handler, parentPort, } from "@ohos/flexsearch/src/worker/ark.js"; setEncode(charsetDefault.encode); parentPort.onmessage = handler;

多字段检索还是使用 Document 对象,需在构建对象的配置里设置开启 worker


import FlexSearch, { StoreOption } from "@ohos/flexsearch"; import charsetCJK from "@ohos/flexsearch/src/lang/cjk/default.js"; const options: IndexOptionsForDocumentSearch<DocsDataType, StoreOption> = { rtl:false, tokenize: 'strict', encode: false, worker:true } const index = new FlexSearch.Document(options);

然后 entry 工程目录里,与 pages 目录同级创建 workers 目录,然后在 workers 目录里新建 worker.js 文件 worker.js 也可为其它文件名,但是上面的配置也需改动,如 myworker.js,则上面配置为 new Document({worker: "workers/myworker.js"});


import charsetCJK from "@ohos/flexsearch/src/lang/cjk/default.js"; import { setEncode, handler, parentPort, } from "@ohos/flexsearch/src/worker/ark.js"; setEncode(charsetCJK.encode); parentPort.onmessage = handler;

关于 charset 和 lang 的说明

本库初始化时,仅默认注册了 5 种 charset,如下:


// flexsearch.js if (SUPPORT_ENCODER) { registerCharset("latin:default", charset_default); registerCharset("latin:simple", charset_simple); registerCharset("latin:balance", charset_balance); registerCharset("latin:advanced", charset_advanced); registerCharset("latin:extra", charset_extra); registerCharset("cjk:default", charset_cjk); }

故 charset 以字符串为值的时候,只能默认使用以上 5 种,'latin'即'latin:default','cjk'即'cjk:default'。 或者为了方便,在需要使用到其它内置的 charset 或自定义的 charset 时,也可先全局注册,eg:


import FlexSearch from "@ohos/flexsearch"; import charsetArabic from "@ohos/flexsearch/dist/module/lang/arabic/default.js"; import langEN from "@ohos/flexsearch/dist/module/lang/en.js"; FlexSearch.registerCharset("arabic:default", charsetArabic); FlexSearch.registerLanguage("en", langEN); const index = new FlexSearch.Index({ charset: "arabic", lang: "en", });

直接使用 import 对象的方式,eg:


import FlexSearch from "@ohos/flexsearch"; import charsetLatinDefault from "@ohos/flexsearch/dist/module/lang/latin/default.js"; import langEN from "@ohos/flexsearch/dist/module/lang/en.js"; const index = new FlexSearch.Index({ charset: charsetLatinDefault, lang: langEN, });

目录


./entry/src/main/ets/MainAbility/ │── library │ └──src 库源码目录 │ └──lang 内置语言和字符集处理目录 │ └──arabic 阿拉伯字符集处理目录 │ └──cjk 中日韩字符集处理目录 │ └──cyrillic 西里尔字符集处理目录 │ └──latin 拉丁字符集处理目录 │ └──at.js 奥地利语言处理 │ └──de.js 德国语言处理 │ └──en.js 英式英语处理 │ └──us.js 美式英语处理 │ └──worker worker线程内部实现目录 │ └──ark.js worker线程逻辑实现 │ └──index.js WorkerIndex对象逻辑实现 │ └──async.js Async方法的公共实现逻辑 │ └──cache.js 缓存实现逻辑 │ └──common.js 通用工具函数 │ └──config.js 内部逻辑配置 │ └──document.js Document对象逻辑实现 │ └──flexsearch.js flexsearch库入口文件 │ └──global.js 全局配置 │ └──index.js Index对象逻辑实现 │ └──intersect.js SearchOptions中suggest的处理逻辑 │ └──lang.js 语言处理的公共函数 │ └──preset.js Index中preset构造配置项的处理逻辑 │ └──serialize.js 序列化处理逻辑,如导入和导出 │ └──type.js 用来做类型注释 │── model demo逻辑处理和数据文件目录 │── pages 页面文件目录 │── utils 工具类目录 │── workers ark环境worker脚本目录

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐