fts3 SQLiteのロシア語の語幹解析アルゴリズムの統合

この記事では、 ステミング拡張機能をSQLiteコードに統合した経験を共有したいと思います。 すべてのアクションは、OS Ubuntu 11.10で実行されました。

問題


fts3 SQLiteには、 Porterのステミングアルゴリズムを実装する単純なステマーがありますが、ロシア語には実装がありません。 つまり 「ホテル」という単語の一致では、「ホテル」という単語を含むレコードは検索されません。

コンパイル準備


必要なもの



さらに、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.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:修正されたリンク

Source: https://habr.com/ru/post/J131265/


All Articles