問題
fts3 SQLiteには、 Porterのステミングアルゴリズムを実装する単純なステマーがありますが、ロシア語には実装がありません。 つまり 「ホテル」という単語の一致では、「ホテル」という単語を含むレコードは検索されません。
コンパイル準備
必要なもの
- リポジトリからのsqlite3ソース。
- C言語のステマー(以下を参照)。
- オプションのreadlineライブラリ(libreadline)。コンソールクライアントの入力コマンドの履歴が必要な場合。
さらに、sqlite3ソースが$ HOME / SQLiteにあると想定されています。
ステマーコード
ロシア語文字UTF-8のエンコード。
Stemmerは、ラテン語の単語に組み込みのPorter Stemmerを使用し、ロシア語の単語にも同様のアルゴリズムを実装します。
コードはもともとC ++用に作成され、SQLiteの拡張機能としてロードされました。 C言語コンパイラでコンパイルできるように修正したので、美しく厳格なものとはほど遠い。 起こったことは次のとおりです。
fts3_porter_ext.c
ステマーを$ HOME / SQLite / ext / fts3 / fts3_porter_ext.cに配置します
ファイル編集
Makefile.in
ファイル$ HOME / SQLite / Makefile.inを編集します。
- fts3_porter_ext.loステマーを変数LIBOBJS0に追加します
- $(TOP)/ext/fts3/fts3_porter_ext.cをSRC変数に追加します
- アセンブリfts3_porter_ext.loのルールを記述します。
fts3_porter_ext.lo: $(TOP)/ext/fts3/fts3_porter_ext.c $(HDR) $(EXTHDR)
$(LTCOMPILE) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3_porter_ext.c
fts3.c
$ HOME / SQLite / ext / fts3 / fts3.cを編集します。
行の後に追加
void sqlite3Fts3PorterTokenizerModule(sqlite3_tokenizer_module const**ppModule);
行
void sqlite3Fts3PorterTokenizerModule1(sqlite3_tokenizer_module const**ppModule);
行の後
sqlite3Fts3PorterTokenizerModule(&pPorter);
モジュールの初期化を追加します
const sqlite3_tokenizer_module *pPorter1 = 0;
sqlite3Fts3PorterTokenizerModule1(&pPorter1);
最後に
|| sqlite3Fts3HashInsert(pHash, "porter", 7, (void *)pPorter)
モジュールを組み込みトークンのハッシュに追加します
|| sqlite3Fts3HashInsert(pHash, "russian", 8, (void *)pPorter1)
mkfts3amal.tcl
$ HOME / SQLite / ext / fts3 / mkfts3amal.tclを編集します
行の後
fts3_tokenizer1.c
追加する
fts3_porter_ext.c
mksqlite3c.tcl
$ HOME / SQLite / tool / mksqlite3c.tclを編集します
行の後
fts3_tokenizer1.c
追加する
fts3_porter_ext.c
編集
次のことをしましょう(--prefix = $ HOMEは、より健全なものに置き換える方が良いです。これがインストールパスになります)
cd $HOME/SQLite && mkdir build && cd build && ../configure --prefix=$HOME CFLAGS='-DSQLITE_SOUNDEX -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS' && make
次に、ステマーがsqlite3.cにあることを確認します
grep fts3_porter_ext.c sqlite3.c
次のようなものが得られるはずです。
/************** Begin file fts3_porter_ext.c *********************************/
/************** End of fts3_porter_ext.c *************************************/
次に、コンピューターにsqlite3をインストールします。
sudo make install
使用する
fts3テーブルを作成する場合、次のようにステマーを指定する必要があります。
CREATE VIRTUAL TABLE tag_fti USING fts3(name, tokenize=russian);
これで、tag_ftiテーブルのMATCHクエリで、ステマーが使用されます。
まとめ
プロジェクトに接続できるsqlite3.cおよびsqlite3.hファイルが2つありました。
拡張モジュールをダウンロードする必要はありません。
アプリケーションが作成するfts3テーブルへのリクエストを正しく処理するコンソールクライアントを取得しました。 また、コンソールクライアントによって作成されたテーブルがアプリケーションによって処理されることもあります。
この記事が誰かに役立つとうれしいです。
UPD:修正されたリンク