该项目是从SQLite Android绑定中复制和修改的,以支持扩展加载,全文搜索和多语言单词分割。请阅读SQLite Android绑定文档以获取更多信息。
在使用之前,您应该知道以下详细信息:
version 3.17.0 。armeabi-v7a和arm64-v8a 。该项目提供以命令行运行的工具,当前支持Unix-like OS ,运行以下命令以buid:
$ cd / < your-project-dir > /host
$ chmod +x build.sh
$ ./build.sh现在,您将在目录./out中找到一个名为sqlite3和3个扩展库的可执行文件。在命令行中运行以下命令以检查是否有效:
$ cd out
$ . / sqlite3
SQLite version 3 . 17 . 0 2017 - 02 - 13 16 : 02 : 40
Enter " .help " for usage hints.
Connected to a transient in - memory database.
Use " .open FILENAME " to reopen on a persistent database.
sqlite > SELECT sqlite_compileoption_used( ' ENABLE_LOAD_EXTENSION ' );
1
sqlite > SELECT load_extension( ' ./libspellfix ' );
sqlite > CREATE VIRTUAL TABLE spellfix USING spellfix1;
sqlite > INSERT INTO spellfix(word) VALUES ( ' frustrate ' );
sqlite > INSERT INTO spellfix(word) VALUES ( ' Frustration ' );
sqlite > SELECT word FROM spellfix WHERE word MATCH ' frus ' ;
frustrate
Frustration检查文件build.sh以找出编译选项,您可能想知道更多,请阅读此主题:如何编译SQLITE。
首先,请确保已安装了NDK ,然后将以下代码添加到您的local.properties文件中以构建库:
ndk.dir=/your/ndk/directory
预制的ICU库放置在目录中./sqlite3/src/main/jni/sqlite/icu_lib_[arch] ,请检查此项目,以获取有关如何交叉Compile icu4c的更多信息。
加载本地库:
System . loadLibrary ( "sqliteX" );用org.sqlite.database.sqlite替换android.database.sqlite名称空间。例如,以下内容:
import android . database . sqlite . SQLiteDatabase ;应该替换为:
import org . sqlite . database . sqlite . SQLiteDatabase ;有关更多详细信息,请阅读此主题。
FTS3和FTS4是SQLite虚拟表模块,允许用户在一组文档上执行全文搜索。
我们使用FTS3和FTS4执行全文搜索, icu在SQLite中执行multi-language words segmentation 。
以下代码显示了如何使用FTS和ICU 。
SQLiteDatabase db = helper . getWritableDatabase ();
// Create an FTS table with a single column - "content"
// that uses the "icu" tokenizer
db . execSQL ( "CREATE VIRTUAL TABLE icu_fts USING fts4(tokenize=icu)" );
// Insert texts into the table created before
db . execSQL ( "INSERT INTO icu_fts VALUES('Welcome to China.')" );
db . execSQL ( "INSERT INTO icu_fts VALUES('Welcome to Beijing.')" );
db . execSQL ( "INSERT INTO icu_fts VALUES('中国欢迎你!')" );
db . execSQL ( "INSERT INTO icu_fts VALUES('北京欢迎你!')" );
// Perform full-text searches
Cursor c = db . rawQuery ( "SELECT * FROM icu_fts WHERE icu_fts MATCH 'welcome'" , null );
while ( c . moveToNext ()) {
Log . d ( TAG , "search for 'welcome': " + c . getString ( 0 ));
// Should be:
// Welcome to China.
// Welcome to Beijing.
}
c . close ();
c = db . rawQuery ( "SELECT * FROM icu_fts WHERE icu_fts MATCH '欢迎'" , null );
while ( c . moveToNext ()) {
Log . d ( TAG , "search for '欢迎': " + c . getString ( 0 ));
// Should be:
// 中国欢迎你!
// 北京欢迎你!
}
c . close ();您可以使用binary operators执行逻辑搜索并结合辅助功能以执行更复杂的搜索。有关更多详细信息,请阅读文档。
SQLite具有在运行时加载扩展(包括新的应用定义的SQL功能,整理序列,虚拟表和VFSE)的能力。此功能允许开发扩展的代码与应用程序分开开发和测试,然后在需要的基础上加载。
基本上,SQLite扩展名是一个“插件”,它实现了一组特定功能,可以动态加载到SQLite中。
以下代码显示了如何检查是否支持扩展加载:
SQLiteDatabase db = helper . getWritableDatabase ();
Cursor c = db . rawQuery ( "SELECT sqlite_compileoption_used('ENABLE_LOAD_EXTENSION')" , null );
// The result must not be 0
assert ( c . getInt ( 0 ) != 0 );启用或禁用扩展加载:
// The following code CAN NOT run in a transaction
// Enable extension loading
db . enableLoadExtension ( true );
// Disable extension loading
db . enableLoadExtension ( false );启用后,您现在可以加载扩展名,以spellfix为例:
// Load successfully if there are no exceptions thrown
Cursor c = db . rawQuery ( "SELECT load_extension('libspellfix')" , null );
c . moveToFirst ();
Log . i ( TAG , "Load spellfix, result = " + c . getInt ( 0 ));编写自己的扩展名也很简单,请确保您已经阅读了此主题。
有3个内置的扩展名, offsets_rank , okapi_bm25和spellfix ,源代码放置在Directory builtin_extensions中。默认情况下启用了这些扩展,您可以通过将以下代码添加到local.properties文件中来禁用它。
useBuiltinExtensions=false
该文件说:
该Spellfix1虚拟表可用于搜索大型词汇以查看近距离匹配。例如,Spellfix1可用于建议更正拼写错误的单词。或者,它可以与FTS4一起使用可能拼写错误的单词进行全文搜索。
您可以从此处下载最新的源代码。
快速看:
sqlite > SELECT load_extension( ' ./libspellfix ' );
sqlite > CREATE VIRTUAL TABLE demo USING spellfix1;
sqlite > INSERT INTO demo(word, rank) VALUES ( ' frustrate ' , 2 );
sqlite > INSERT INTO demo(word, rank) VALUES ( ' Frustration ' , 3 );
sqlite > INSERT INTO demo(word, rank) VALUES ( ' frustate ' , 1 );
sqlite > SELECT word FROM demo WHERE word MATCH ' fru* ' ;
frustrate
Frustration
frustate可以在这里找到更多详细信息。
用于计算FTS匹配的简单相关性的函数Offsets()的扩展名。返回的值是相关得分(实际值大于或等于零)。更大的值表示更相关的文档。
根据函数offsets()返回的值,它在每个项上包含4个整数值,最后一个值是字节中的匹配项的大小,通常该值将与给定项保持相同,但是在某些情况下,例如,当创建带有option tokenize = porter = porter的fts表格时,并包含以下记录:
docid content
------ -------
1 sleep
2 sleeping
当我们执行查询时:
SELECT docid, content, offsets(fts) FROM fts WHERE fts MATCH ' sleeping ' ;
SELECT docid, content, offsets(fts) FROM fts WHERE fts MATCH ' sleep ' ;将获得完全相同的结果:
docid content offsets
------ ------- -------
1 sleep 0 0 0 5
2 sleeping 0 0 0 8
但是,当搜索sleeping时,我们希望在记录sleeping中获得更高的分数,功能offsets_rank将解析功能offsets返回的值并调整相关得分。以下查询返回匹配从大多数到最不相关的全文查询的文档:
SELECT docid, content FROM fts WHERE fts MATCH ' sleeping '
ORDER BY offsets_rank(offsets(fts)) DESC ;结果将是:
docid content
------ --------
2 sleeping
1 sleep
该文件是根据MIT许可证的SQLite-Okapi-BM25的叉子。排名函数使用内置的MatchInfo函数来获取计算得分所需的数据。确保您在使用之前已阅读这些文档。
除了SQLite中包含的文件外,所有其他文件均在MIT许可下。