2011年10月19日(水)test case.

日記全文検索の改善を実行した。「何をどう改善したのか」。文章構築能力の向上も含めてのこれまでの課題とその内容をどう解決したのか。それらのメモ内容。

課題1:これまでの日記全文検索は動作速度が遅かった。
解決1:スクリプトを書き換えて高速化を実行。strtrではなくstr_replaceを使って高速化。一部にはpreg_replaceを割り当てて文字列検出精度の向上も実行。

課題2:これまでの日記全文検索は2つまでの単語しか検索出来なかった。「単語1と単語2のアンド検索」。「3つ目の単語」が入る余地が無かった。
解決2:「単語1があって単語2もある場合」。「単語1があって単語2がない場合」。これまでのコードの内容。その分け方では3つ目以降の区分けが冗長化する。

まずは「シンプルなコード」にまとめあげる事。その為にコードを全面的に書き換える必要があったので以下の展開を使って書き換えた。

・単語の数を数える。半角スペースで区切られた内容が全部で幾つあるのか。自分が考える常識的な個数は「3つ」。従って「上限は3つまで」と決める。
・単語の数を数える。「1個」、「2個」、「3個」。そこが最大。まずは「入力された単語が全部で幾つになるのか?」とした単語の個数の情報を取得する。

・検索対象となる日記を1行ずつ読み取っていく。日記1回分につき1行。単語は仮に3つ入力されたとする。「単語1」、「単語2」、「単語3」の3つの単語が
全てその1行に収まっているかどうか。単語の数を上限としてのwhileによるループを行って1つずつ「単語の存在を確認する」。

・確認する前に「0」の数字をセットする。単語1があった場合には「1」変数にセットしたその数字が増える。「0+1+1+1=3」となって、最大の数字は「3」となる。
・単語の数は「3つ」。記録された数字は「3」。単語の数と文字列検索によって単語が存在していた回数が一致した場合にのみその1行を表示する。

上記の考え方に変更を遂げたシンプルなコードに内容を書き換えた。これで将来的に「単語の数の上限が4つ、あるいは5つ」に変えたくなっても対応可能。

課題3:これまでの日記全文検索はタグの文字列にも反応。結果表示が崩れてしまう。タグの中と同じ文字でもタグの中にあれば検索の対象にしない。
解決3:一部に割り当てたpreg_replaceを「e」ポジションで使用した。タグを表す不等号の中には反応せず、とした正規表現を使ってタグを検索対象から除外した。

課題4:これまでの日記全文検索では「アルファベット1文字」などの短い英単語を入力しても反応していた。入力しても意味の無い状況に反応していた。
解決4:入力された単語の文字数を単語ごとに数える。特定の文字数よりも少ない場合には検索を拒否する。ある程度の文字数が必要な状態とした。

課題5:特定の文字が検索したい単語に入っていると正しくマッチしない。preg_replaceで「for character class at offset」のエラーが出る。
解決5:文字コードを内部で変換する。入力された単語を内部でUTF-8に変換。検索対象となる日記も内部でUTF-8に変換。文字列の一致状況を
SJISではなくUTF-8で調査する。一致した結果のみを出力する。その際の出力をSJISに「結果、再度戻す事になる」変換を掛けてから出力を行う。

・preg_replaceとSJISは相性が悪い。「スマートフォン」あるいは「パリーグ」の「ー(長音)」が入ると検索に引っ掛からない。
・最初からUTF-8で日記を書くとファイルサイズが肥大化する。個人的に回避。例えば2011年9月の日記。1ヶ月分の日記の容量を比較する。
・「SJISの文字コードで保存した場合は432,502KB」、「UTF-8の文字コードで保存した場合は629,874KB」。1ヶ月分の日記の容量を比較する。

これだけのファイルサイズの違いとなって現れる。

・UTF-8で内部処理を行うと言う展開は永続的なものではなく一時的な展開。現在はこの方法が無難だから採用を行っているだけ。

以上の展開を実行して、日記全文検索の改善行為(これまでに生じていた不具合の解決)と記録する。

2011年10月19日(水)00時37分25秒