このプロジェクトは、拡張ロード、フルテキスト検索、多言語ワードセグメンテーションをサポートするために、SQLite Android Bindingsからコピーおよび変更されています。詳細については、SQLite Android Bindingsドキュメントをお読みください。
以下の詳細は、使用する前に注意する必要があります。
version 3.17.0でSQLite3を使用しています。armeabi-v7aとarm64-v8aです。このプロジェクトは、コマンドラインで実行されるツールを提供し、現在のサポートUnix-like OSをサポートし、次のコマンドを実行してBUIDに実行します。
$ cd / < your-project-dir > /host
$ chmod +x build.sh
$ ./build.shこれで、Directory ./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] 、このプロジェクトを確認して、 icu4cクロスコンパイルする方法についての情報を増やしてください。
ネイティブライブラリをロードします:
System . loadLibrary ( "sqliteX" ); android.database.sqlite namespaceをorg.sqlite.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があり、ソースコードはディレクトリ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詳細については、こちらをご覧ください。
function offsets()で使用する拡張機能は、FTS一致の単純な関連性を計算します。返される値は、関連スコア(ゼロ以下の実際の値)です。値が大きくなると、より関連性の高いドキュメントが示されます。
関数offsets()によって返される値によると、各用語に4つの整数値が含まれます。最後の値はバイトの一致用語のサイズです。通常、値は指定された用語で同じになりますが、場合によっては、たとえば、オプションを作成した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ライセンスの下にあります。