中国語の検索抜粋が壊れているようです

フォーラムで中国語を検索しようとすると、検索結果が文が分断されて表示され、句読点が欠落し、単語間に予期せぬ空白が入り、一部の単語が欠けていることがわかります。

例えば、「管理员」と検索すると、元の文は以下の通りです。

管理人员可见的分类。只有管理员和版主才能阅览主题

しかし、検索結果では以下のようになっています。

ご覧の通り、「可见的」が欠落しており、句点「。」も欠けていて文が分断されています。また、「只有」「和」「才能」も欠落しており、単語間に予期せぬ空白が入っています。

この問題についてご助力いただけますでしょうか?よろしくお願いいたします。

「いいね!」 2

どうやら、欠落している文字は中国語のストップワードとみなされているようです。

(byebug) data = CppjiebaRb.segment(search_data, mode: mode)
["管理人员", "可见", "的", "分类", "。", "只有", "管理员", "和", "版主", "才能", "阅览", "主题"]
(byebug) CppjiebaRb.filter_stop_word(data)
["管理人员", "分类", "管理员", "版主", "阅览", "主题"]
「いいね!」 3

つまり、バグというのは検索結果の「サマリー」がおかしいということであって、検索自体に機能的な問題があるわけではない、という理解で合っていますか?

はい、検索機能は正常に動作していますが、表示される抜粋が最適ではありません。中国語の場合、検索クエリ自体でストップワードを無視するのではなく、検索データから完全に除外する形で処理が異なります。

「いいね!」 3

ご確認いただきありがとうございます。

これは中国語のストップワードではなく、「visible(可視)」を意味する形容詞です。

この問題を修正することは可能でしょうか(検索結果に含まれるすべての対象を含めて)。あるいは、回避策はありますか?

よろしくお願いいたします。

「いいね!」 1

ストップワードとは、検索のパフォーマンスを低下させる非常に一般的な単語を指します。

例えば、英語における「and」はストップワードです。

これを修正することは可能ですが、実装までには数ヶ月を要します。そのため、至急対応が必要な場合は、Marketplace までご連絡ください。

pr-welcome とマークします。

「いいね!」 2

ストップワードは GitHub - yanyiwu/cppjieba: "结巴"中文分词的C++版本 · GitHub を使用して決定されます。検索抜粋の表示方法に関する最近の変更により、実際の検索データに混乱を招く次の行を削除すべきです。

いずれにせよ、中国語の検索サポートは十分ではありませんが、ネイティブサポートを持たない言語を適切にサポートできるよう、検討すべき PG 拡張機能があるかもしれません。https://pgroonga.github.io/ はどうでしょうか?

「いいね!」 5

ありがとうございます!これで試してみて、どうなるか見てみます。

@tgxworld 正しく理解できているか自信がありませんが、PGroonga は中国語や日本語をサポートしていないとのことですね。https://pgroonga.github.io/ には以下のように記載されています。

PostgreSQL は、アルファベットと数字のみを使用する言語に対する全文検索をサポートしています。つまり、PostgreSQL は日本語や中国語などに対する全文検索をサポートしていません。PGroonga を PostgreSQL にインストールすることで、すべての言語に対して超高速な全文検索機能を利用できます!

@tgxworld ご提案いただいた通り、PRを作成しました FIX: keep chinese stopwords on search by t0t07 · Pull Request #11530 · discourse/discourse · GitHub

意味はまさにその逆です。通常の PostgreSQL は中国語や日本語をサポートしていませんが、PGroonga はそれらの言語をサポートする機能を追加します。

「いいね!」 3

余談ですが @riking、確認させてください。現在、Discourse は PostgreSQL の組み込み関数を使用して全文検索を実装していますが、discourse/lib/search.rb at 1cf057fb1c4e168ce441ddde918636725abeb668 · discourse/discourse · GitHub の通りで合っていますか?

「いいね!」 1

当初、より具体的に説明しなかったことをお詫びします。現時点でこれを修正したいのであれば、検索データから中国語のストップワードを削除しないようにしつつ、検索クエリとして使用される際はストップワードを削除するという条件を満たす必要があります。

「いいね!」 1

@tgxworld 「検索データ」と「検索クエリ」の違いがわかりません。詳しくご説明いただけますか?ありがとうございます。

停止語をインデックスに追加すると、インデックスが肥大化し、検索パフォーマンスが低下します。

PostSearchData テーブルには 2 つの列が格納されています。#search_data は検索語句に対するクエリに使用され、#raw_data は検索抜粋の表示に使用されます。ここでの修正は、中国語のストップワードを #search_data では削除しつつ、#raw_data では削除しないようにすることです。

このバグの進展はありますか?

ここで何か変更を加えたと思ったのですが:

お使いのロケールは zh_TWzh_CN、または ja に設定されていますか?設定されていない場合、search_tokenize_chinese_japanese_korean は true に設定されていますか?

ここには回避策があります:

「いいね!」 2