Searchモジュール改造:全角英数字への対応/「ー(長音符・長音・音引き)」への対応

必ず自己責任で! 【注意書き】ページ参照下さい!

Searchモジュールでの検索(このサイトであれば、左上の検索フォーム)から、日本語(マルチバイト)で検索すると、どうも都合の悪い場合が存在します。

検索処理の基本的な部分をオーバーライドすることが出来ないので、コアモジュールを改造しちゃいました。

マルチバイト(全角)英数字への対応

例えば、以前はこのサイトで、全角アルファベット 「 CCK 」で検索すると、検索結果にはヒットしませんでした。本文の中で書かれているアルファベットが、全て半角(「CCK」)だからです。

本来であれば、この辺はSQL側(本文格納時や、インデックス化の段階)で対応するべきなのでしょうが、とりあえず自分のサイトで、ちゃんと検索だけ出来るようにしたかったので、「Searchモジュール」の改造で対応しました。

要するに検索される前に、「全角英数字」を「半角英数字」に変換すればよいので、

DocumentRoot/modules/search/search.module 332行目あたり
// With the exception of the rules above, we consider all punctuation,
// marks, spacers, etc, to be a word boundary.
$text = preg_replace('/['. PREG_CLASS_SEARCH_EXCLUDE .']+/u', ' ', $text);

の後に、

$text = mb_convert_kana( $text,"rn");

とすれば、「全角英数字」を「半角英数字」に変換した上で、検索してくれます。

但し、当然PHPの「mb」必須ですので、ご注意下さい。

しつこいようですが、必ず自己責任で! 【注意書き】ページ参照下さい!

将来的には、「cron 」実行時に行われる「インデックス付け」のタイミングで、本文中に存在する全角英数字を、半角英数字に変換してインデックス化するようにしようと思います。
そのうち、気が向いたら、それも書きます。

≡ Drupal Japan ≡ さんでは、ちゃんと全角英数字でも、半角英数字の検索が出来てるんですけど、どこで対応してるんでしょうね?
やっぱり、DBが違うんでしょうか?
PostgreSQL だと問題ない、と、どこかで読んだような気もしないでもないですが。

いずれ、「正解」が分かったら、また追記します。

「ー」(長音符・長音・音引き)への対応

以前このサイトでは、「カラー」で検索しても、検索結果が存在しませんでした。
本来なら、「カラーセット」について記載されているページがヒットするはずなのですが、これが何故かヒットしませんでした。

この件も、Searchモジュールを改造(修正?)することで、解決します。

ネタ元は、
Searchモジュールの日本語認識について | groups.drupal.org

具体的には、

DocumentRoot/modules/search/search.module 22行目以降45行目あたり
define('PREG_CLASS_SEARCH_EXCLUDE',
'\x{0}-\x{2f}\x{3a}-\x{40}\x{5b}-\x{60}\x{7b}-\x{bf}\x{d7}\x{f7}\x{2b0}-'.
・・・中略・・・
'\x{3099}-\x{309e}\x{30a0}\x{30fb}-\x{30fe}\x{3190}-\x{319f}\x{31c0}-\x{31cf}'.
・・・後略・・・

の、「 30fb 」を、「 30fc 」 に修正することで、「ー」(長音符・音引き)が検索できるようになります。

しつこいようですが、必ず自己責任で! 【注意書き】ページ参照下さい!

Unicode は良くわからないし、正規表現も苦手なので深くはつっこまないですが、
何にせよ、原因を見つけた Garrett に感謝!