Code

BookStackで検索が正しく動作しない問題への対応

スポンサーラベル
Code

BookStackは、オープンソースのドキュメント管理ツールとして、多くの企業や組織で採用されています。
前回はLDAP認証のADグループを利用したBookStackの役割連携方法について説明しました。 
https://syachiku.net/bookstack-setup03/

今回は実際に使っている中で発生していた検索の利便性についての対応方法を説明していきたいと思います。

問題:検索が前方一致しか反応しない

BookStackは高度な検索機能を備えていて、簡単に必要な情報を探すことができます。
しかし、今回試していた、「BookStack v24.12」では 検索の際に前方一致しか対応していませんでした。もし、部分一致をするには「”(検索文字列)”」のようにダブルクォートで囲まないと動作しません

例として以下ですが、ページ内に「あいうえお」という文字列がありますが、「あいう」では検索にヒットしますが、「うえお」ではヒットしません

もし部分一致に対応したい場合には「”うえお”」のようにダブルクォートで表示する必要があります。

対策:部分一致するようにソースコードを修正する

このように部分一致をするためにダブルクォートを設定しなければならないのは不便です。そこで、対応のためにソースコードを修正します。

修正ファイル: /var/www/bookstack/app/Search/SearchRunner.php ※バージョンによってパスが異なるみたいです。
→ 208行目と267行目にある検索条件のlikeに前方も含める’%’を追加する

206             foreach ($terms as $inputTerm) {
207                 $escapedTerm = str_replace('\\', '\\\\', $inputTerm);
208                 $query->orWhere('term', 'like', $escapedTerm . '%');
209             }
                  ↓
206             foreach ($terms as $inputTerm) {
207                 $escapedTerm = str_replace('\\', '\\\\', $inputTerm);
208                 $query->orWhere('term', 'like', '%' . $escapedTerm . '%');
209             }
262         foreach ($options->searches->toValueArray() as $term) {
263             $whenStatements[] = 'WHEN term LIKE ? THEN ?';
264             $whenBindings[] = $term . '%';
265             $whenBindings[] = $term;
266 
267             $termQuery->orWhere('term', 'like', $term . '%');
268         }
                  ↓
262         foreach ($options->searches->toValueArray() as $term) {
263             $whenStatements[] = 'WHEN term LIKE ? THEN ?';
264             $whenBindings[] = $term . '%';
265             $whenBindings[] = $term;
266 
267             $termQuery->orWhere('term', 'like', '%' . $term . '%');
268         }

動作確認

検索に「うえお」を入力するとダブルクォートなしでも部分検索ができるようになりました!

これで検索がさらに便利になってBookStackが使いやすくなりました。

次回は同じくBookStackで問題になるPDFエクスポートしたときに日本語が文字化けする問題への対応について記事にしたいと思います。

今回は以上となります。

コメント

タイトルとURLをコピーしました