# flexsearch-ohos **Repository Path**: wurep/flexsearch-ohos ## Basic Information - **Project Name**: flexsearch-ohos - **Description**: No description available - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 17 - **Created**: 2022-03-21 - **Last Updated**: 2022-03-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 简介 本项目是基于js库开源库 [flexsearch](https://github.com/nextapps-de/flexsearch/tree/0.7.2) 进行移植的openharmony适配版本。 flexsearch是最快且最具内存灵活性的全文搜索库,零依赖性。 在原始搜索速度方面,FlexSearch优于每一个搜索库, 并提供灵活的搜索功能,如多字段搜索,语音转换或部分匹配。根据使用的选项,它还提供最高内存效率的索引。 FlexSearch引入了一种新的评分算法,称为“上下文索引”,基于预先评分的词典字典体系结构,与其他库相比,实际执行的查询速度有大幅度提高。 FlexSearch还为您提供非阻塞异步处理模型,以通过专用平衡线程并行地对索引执行任何更新或查询。 ## 目录 ``` ./entry/src/main/ets/MainAbility/ │── flexsearch │ └──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脚本目录 ``` ## 使用说明 ### 安装 ```shell npm install @ohos/flexsearch-ohos --save ``` 需配置npm仓库,已配置过的可忽略,配置方式:
找到.npmrc配置文件(可通过*npm config list*命令查看文件目录),打开.mpmrc配置文件添加@ohos的scope仓库地址: @ohos:registry=https://repo.harmonyos.com/npm/ ### 快速接入 单字段检索使用Index更简单,多字段检索使用Document,以Document为例 ```javascript import FlexSearch from "@ohos/flexsearch-ohos"; const index = new FlexSearch.Document({ // 中文检索需要使用CJK编码方式或自定义 charset:'cjk', document: { id: "url", tag:"tag", index: ["title","content"], store:["url","title"] } }); // 可自定义字段名 const doc1={ url: "url1", tag:"疫情", title: "疫情波及8省份!加强针什么时候能打?疾控专家提醒冬季疫情 ...", content: "大象新闻消息,仅三天时间,由上海老人旅行团串联起来的本轮疫情,已经 ... 10月18日,陕西省卫健委通报,当地新增本土确诊病例6例,无症状感染者1..." }; 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); } ``` **关于配置项参数options的详细说明,原库readme中有详细的说明,请见**[flexsearch readme](https://github.com/nextapps-de/flexsearch/tree/0.7.2) ### 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`, 或者,您可以将回调函数作为最后一个参数传递. 方法`export`和`import`始终是异步的,您在基于Worker的索引上调用的每个方法也都是异步的. ### worker功能使用说明 **单字段检索使用使用worker功能需用FlexSearch.Worker代替FlexSearch.Index** 由于线程间数据传递序列化问题,charset对象里的encode属性(value为function)会被忽略,此时需将charset对象拆分传递,并且将charset.encode做个特殊处理,不传递function改为传递function.name ```javascript import FlexSearch from "@ohos/flexsearch-ohos"; import charsetDefault from '@ohos/flexsearch-ohos/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文件 ```javascript // worker.js import charsetDefault from '@ohos/flexsearch-ohos/src/lang/latin/default.js' import { setEncode, handler, parentPort } from '@ohos/flexsearch-ohos/src/worker/ark.js'; setEncode(charsetDefault.encode); parentPort.onmessage = handler; ``` **多字段检索还是使用Document对象,需在构建对象的配置里设置开启worker** ```javascript import FlexSearch from "@ohos/flexsearch-ohos"; import charsetCJK from '@ohos/flexsearch-ohos/src/lang/cjk/default.js' const index = new FlexSearch.Document({ rtl: charsetCJK.rtl, tokenize: charsetCJK.tokenize, encode: charsetCJK.encode.name, // value is boolean or worker file path worker: true }); ``` 然后entry工程目录里,与pages目录同级创建workers目录,然后在workers目录里新建worker.js文件 worker.js也可为其他文件名,但是上面的配置也需改动,如 myworker.js,则上面配置为new Document({worker: "workers/myworker.js"}); ```javascript import charsetCJK from '@ohos/flexsearch-ohos/src/lang/cjk/default.js'; import { setEncode, handler, parentPort } from '@ohos/flexsearch-ohos/src/worker/ark.js'; setEncode(charsetCJK.encode); parentPort.onmessage = handler; ``` ### 关于charset和lang的说明 本库初始化时,仅默认注册了5中charset,如下: ```javascript // 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: ```javascript import FlexSearch from "@ohos/flexsearch-ohos"; import charsetArabic from "@ohos/flexsearch-ohos/dist/module/lang/arabic/default.js"; import langEN from "@ohos/flexsearch-ohos/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: ```javascript import FlexSearch from "@ohos/flexsearch-ohos"; import charsetLatinDefault from "@ohos/flexsearch-ohos/dist/module/lang/latin/default.js"; import langEN from "@ohos/flexsearch-ohos/dist/module/lang/en.js"; const index = new FlexSearch.Index({ charset: charsetLatinDefault, lang: langEN }); ```