Skip to content

基于 Simple (支持中文和拼音的 SQLite fts5 全文搜索扩展) 和 sqlite3.dart 的 Flutter 库,用于 SQLite 中文和拼音全文搜索 | A Flutter plugin for Full-Text Search of Chinese & PinYin in SQLite, based on Simple (A SQLite3 fts5 tokenizer which supports Chinese & PinYin) and sqlite3.dart

License

Notifications You must be signed in to change notification settings

SageMik/sqlite3_simple

Repository files navigation

sqlite3_simple

Pub Package simple-native

Android iOS MacOS Windows Ubuntu

基于 Simple (支持中文和拼音的 SQLite fts5 全文搜索扩展) 和 sqlite3.dart 的 Flutter 库,用于 SQLite 中文和拼音全文搜索。

Important

由于 sqlite3-ohos.dart 在 HarmonyOS NEXT 上在提交审核后打出正式签名 Release 包崩溃的问题,目前暂时删除鸿蒙适配,请不要在 HarmonyOS NEXT 平台上继续使用。

如有需要,可以使用鸿蒙原生实现的 Simple 分词器 sqlite3-simple

sqlite3-simple:基于 Simple (支持中文和拼音的 SQLite fts5 全文搜索扩展) 的 HarmonyOS NEXT 库,用于 @ohos.data.relationalStore (关系型数据库) 的中文和拼音全文搜索。

支持平台 示例
Android (example.apk) Android
iOS iOS
Windows Windows
MacOS MacOS
Linux Linux

目录

前置准备

SQLite 通过 SQLite FTS5 Extension 提供 全文搜索 (Full-Text Search) 功能;

Dart 提供 FFI 以调用 SQLite、Simple 等 C/C++ 库;

本库通过 Simple 实现 中文拼音全文搜索,通过 sqlite3 操作数据库和加载自定义扩展。

请参阅相关文档,或 example 的具体示例,以构建和操作数据库。

Tip

本库主要通过 Github Actions 编译和维护 Simple 原生库,以支持本库在不同平台的 Flutter 实现,具体请参阅 simple-native 分支

本库通过 sqlite3 管理数据库,因此理论上任何依赖于 sqlite3 的 Flutter 库均可通过本库实现中文和拼音全文搜索,例如 driftsqflite_common_ffi 等,可以在 ./example/lib/data/impl 查看不同实现。

快速开始

1. 添加 SQLite 依赖

执行如下命令行:

flutter pub add sqlite3 sqlite3_flutter_libs

其中 sqlite3 包含了 SQLite 的 Dart FFI 绑定, sqlite3_flutter_libs 包含了 SQLite 的原生库 (Native Library) ,源码均在 sqlite3.dart

Tip

若希望自行编译 SQLite 原生库,或环境已存在 SQLite 原生库,可不引入 sqlite3_flutter_libs ,自行通过 DynamicLibraryopen.overrideFor 加载和覆盖。可从下述位置获取相关信息:

  1. sqlite.dartManually providing sqlite3 libraries
  2. sqlite-ohos.dart自行提供 SQLite 原生库
  3. example 中带有 Android SQLite 覆盖 标识的简单示例(可以全局搜索该标识)。

2. 添加本库并导入依赖

flutter pub add sqlite3_simple
import 'package:sqlite3/sqlite3.dart';
import 'package:sqlite3_simple/sqlite3_simple.dart';

3. 加载 Simple 扩展

sqlite3.loadSimpleExtension();

如需启用 结巴分词 (Jieba) ,请调用 sqlite3.saveJiebaDict() 将字典保存到可访问的路径,例如:

import 'package:path_provider/path_provider.dart';

final docDir = await getApplicationDocumentsDirectory();
final jiebaDictPath = join(docDir.path, "cpp_jieba");

final jiebaDictSql = await sqlite3.saveJiebaDict(jiebaDictPath);

返回值 jiebaDictSql"SELECT jieba_dict('$jiebaDictPath')"

4. 打开数据库

参阅 sqlite3 相关说明,通过 sqlite3.open()sqlite3.openInMemory() 打开数据库。

final db = sqlite3.open('$filename');

如需启用结巴分词,请让数据库执行上一步的 jiebaDictSql 语句,以修改 Simple 扩展读取结巴分词字典的路径:

db.execute(jiebaDictSql);

推荐在正式查询前执行一次查询,提前加载,例如:

db.select("SELECT jieba_query('Jieba分词初始化(提前加载避免后续等待)')");

5. 查询

请参阅 SQLite FTS5 ExtensionSimple 的说明,根据需要调用相应函数如 jieba_querysimple_queryhighlightsimple_highlight 等,执行所需的查询,例如 ( ./example/lib/data/impl/sqlite3_impl.dart ):

/// 通过指定分词器 [tokenizer] 搜索, [tokenizer] 取值:jieba, simple
List<MainTableRow> search(String value, String tokenizer) {
  const wrapperSql = "'${ZeroWidth.start}', '${ZeroWidth.end}'";
  final resultSet = db.select('''
      SELECT 
        rowid AS $id, 
        simple_highlight($fts5Table, 0, $wrapperSql) AS $title, 
        simple_highlight($fts5Table, 1, $wrapperSql) AS $content, 
        $insertDate 
      FROM $fts5Table 
      WHERE $fts5Table MATCH ${tokenizer}_query(?);
    ''', [value]);
  return _toMainTableRows(resultSet);
}

致谢

Simple:支持中文和拼音的 SQLite FTS5 全文搜索扩展。

sqlite3.dart:SQLite3 的 Dart FFI 绑定。

extended_text:Flutter Text 的扩展组件,支持特殊文本效果。

About

基于 Simple (支持中文和拼音的 SQLite fts5 全文搜索扩展) 和 sqlite3.dart 的 Flutter 库,用于 SQLite 中文和拼音全文搜索 | A Flutter plugin for Full-Text Search of Chinese & PinYin in SQLite, based on Simple (A SQLite3 fts5 tokenizer which supports Chinese & PinYin) and sqlite3.dart

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published