# 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
});
```