該項目是從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許可下。