ココログのユーザ参加型Q&Aコーナー「みんなで解決!広場」の過去ログを高い精度で検索できる、「過去ログ全文検索(通称“ほぼ全文検索窓”)」を公開しました。既に公開済みの『「みんなで解決!広場」・よくある質問(FAQ)コーナー in あずスタ』に設置しています。
○ココログ「みんなで解決!広場」
【 http://www.cocolog-nifty.com/support/bbs/ 】

○「みんなで解決!広場」・よくある質問(FAQ)コーナー in あずスタ
【 http://adstv-web.cocolog-nifty.com/studio/hiroba_faq.html 】
以下の問題については既に把握済みなので、また後日時間がある時に改善します。
・「ほぼ全文検索窓」は、自作のデータベースを使用しています。
→後述します。
・4/28時点の全過去ログが検索対象になります。
→つまり、データベースの定期的な更新が必要です。
・検索結果に余分なデータが見られる。
→データベース作成時の編集漏れです。
・検索しきれていない過去ログがある。
→データベース作成時の情報漏れです。
・データベースの読み込みに時間が掛かる。
→これはある種“仕方が無い”になるかもしれません。
事情を知らない方のために少し説明します。今年3/10、「みんなで解決!広場」に@niftyの検索サービス「@search(アット・サーチ:Googleのエンジンを使用)」を使った検索窓が設置されました。しかし、Googleによる数週毎のクロールが行われないと検索してもリストアップされないことが多く(特に最近のQ&A)、実際に使ってみると随分前の過去ログさえ上手く検索できないことが分かってきました。
○関連記事・ココログスタッフからのお知らせルーム
『「みんなで解決!広場」リニューアルしました』
【 http://staff.cocolog-nifty.com/room/2006/03/post_001f.html 】
ココログスタッフによれば、設置したのは「検索窓」。これは「Googleに依存する精度の検索窓」というわけで、「全文検索窓」とは程遠いものでした。正直、使えませんでした。そこで私のちょっとした自由研究。「全文検索窓」に相当する高い精度の検索窓、すなわち「ほぼ全文検索窓」を実現してみよう!
目を付けたのは、ココログサポートが用意している「使い方ガイド」の左サイドバーにある検索窓です。
○ココログ「使い方ガイド」
【 http://support.cocolog-nifty.com/ 】

この検索窓の仕組みを少し説明します。機能自体はスクリプト(JavaScript)によって実現されていて、検索窓にキーワードを入力して検索ボタンを押すと、「使い方ガイド」内のヘルプを検索して結果を中央のメイン部分に表示します。どのように検索しているかというと、複数のヘルプファイルからリアルタイムでキーワードを探しているのではなく、各ヘルプの「タイトル・URL・説明」を寄せ集めたデータベースを用意しておいて、その中からキーワードを探しています。そのデータベースは「search_data.js」というファイルになります。
○「使い方ガイド」のデータベースの例(「search_data.js」から抜粋)
var data = new Array();
data[ data.length ] = {title:"1:ココログを始める前に",link:"http://support.cocolog-nifty.com/howto/2006/03/post_ebea.html",body:"1:ココログって何だろう? ココログとは、誰でも簡単にホームページを作ることができるブログ(blog)サービスです。"};
data[ data.length ] = {title:"FAQ:ココログの推奨環境とは?",link:"http://support.cocolog-nifty.com/howto/2006/03/faq_e2e9.html",body:"ココログの推奨環境は次の通りです。"};
data[ data.length ] = {title:"FAQ:ブログって何?",link:"http://support.cocolog-nifty.com/howto/2006/03/faq_d98a.html",body:" 「ブログ」とは、「Web」上の「Log(日誌)」という意味の造語「Weblog(ウェブログ)」を省略したものです。"};
(「title」:タイトル/「link」:URL/「body」:説明)
私はここに注目しました。「広場」の過去ログをこの形式でデータベース化しておいて、既存のスクリプト処理を上手く流用すれば、「全文検索」みたいなものが実現できるんじゃない?
○「広場」用のデータベースの例(案)
var data = new Array();
data[ data.length ] = {title:"1:「広場」って何ですか?",link:"http://~/1.html",body:"1:「広場」って何ですか? ココログのユーザ参加型Q&Aコーナーです。"};
data[ data.length ] = {title:"FAQ:「広場」の使い方は?",link:"http://~/2.html",body:"「ココログで判らないことがあったら、気軽に質問しましょう☆ もし判ることがあったら、親切に教えてあげてね♪」だそうです。"};
data[ data.length ] = {title:"FAQ:「広場」を一言で言えば?",link:"http://~/3.html",body:"「解決が難しい最大の問題」でしょうね・・・。"};
そこでこのたび「過去ログ全文検索(=ほぼ全文検索窓)」の評価版を作成して、「みんなで解決!広場」の「ココログ徹底活用(上級者向け)」カテゴリにて、以下のような発言をしました。
○発言『もし「過去ログ全文検索」があったら?』
この広場での過去のQ&Aを高い精度で検索できる、
「過去ログ全文検索」を作成してみました。
上記URLの「よくある質問(FAQ)コーナー」に設置したので、
使ってみて評価していただけたらうれしいです。
「この広場は、既に『貴重なデータベース』となっている。」
「『貴重なデータベース』を活かせる仕組みを導入してほしい。」
これは、私がこの広場自体に求めてきたことですが、
その「新たな提案」ということで作成し、公開に踏み切りました。
・関連トピック『もし「よくある質問」コーナーがあったら?』
http://message2.nifty.com/tb/board/cocolog/reslist?service_id=expert&board_id=bbs1&mainthread_id=00000108&gubun_key=mthreadc
「広場」以外でデータベース化した過去ログ情報を使うことについて、「ご利用上の注意」には該当しないと思っています。なお、以前の発言『もし「よくある質問」コーナーがあったら?』もだけど、「ココログ徹底活用(上級者向け)」カテゴリで先に展開する理由は、まず中級者以上の人に評価してもらって、改善検討や反映をした後で初級者へ奨めるようにしたいからです。それにより、使い勝手や用語の壁をカバーできることもしばしばあります。また、「広場」を提供するニフティへの一提案という意味で、中級者としてそのカテゴリで意識的に展開している部分もあります。
ちなみに、以前の発言は「2006/02/02」に投稿。今回の発言は「2006/05/02」に投稿。つまり、“ちょうど3ヶ月後のビッグリリース”になるのかな。あくまで一ユーザによる非公式なものですけどね(笑)。
(以下は、興味のある方のみご覧ください。)
「広場」用のデータベースを作る手順を簡単に説明します。
1.「広場」内のQ&AのHTMLファイルをダウンロード
「広場」には現在4つのカテゴリがあります。
・ココログをはじめる前の疑問解決!
・ココログの使い方解決!(初級者向け)
・ココログ徹底活用(上級者向け)
・あなたのブログ紹介コーナー
これらのうち、Q&Aが行われるのは「あなたのブログ紹介コーナー」以外のカテゴリなので、このカテゴリは今回対象外にしました(要望があれば取り入れます)。さてダウンロードの方法ですが、1つ1つブラウザに表示させて保存していたら、日が暮れるどころか気が滅入ってしまいますね(笑)。そこで、「Iria」や「Irvine」といったダウンロード専用ソフト(フリーウェア)を使います。「広場」内のQ&Aはサーバ内でデータベース化されていて、呼び出しはカテゴリ識別子やトピック番号等の指定を含めたURLで行います。これは普段ブラウザでの閲覧時に行っていることです。「ココログをはじめる前の疑問解決!」を例に挙げると、実際はこんな感じになっています。
http://message2.nifty.com/tb/board/cocolog/reslist?service_id=debut&board_id=bbs1&mainthread_id=00000123&gubun_key=mthreadc
「service_id=debut」:「ココログをはじめる前の疑問解決!」カテゴリの指定
「mainthread_id=00000123」:トピック番号「123」
ちなみに・・・。
「service_id=beginner」:「ココログの使い方解決!(初級者向け)」カテゴリの指定
「service_id=expert」 :「ココログ徹底活用(上級者向け)」カテゴリの指定
「service_id=info」 :「あなたのブログ紹介コーナー」カテゴリの指定
先に挙げたソフトには「URL展開」というのがあって、パターン化された複数URLを一つの「型」でまとめてソフトへ渡すと、ソフト側で各URLに展開して全てをダウンロードしてくれます。「広場」のURLの場合、カテゴリ指定は無理だけど、トピック番号は連番なのでURL展開が適用できます。従って、まずは3カテゴリ分の「型」を用意します。トピック番号の範囲ですが、始点は「1(番目)」、終点は「各カテゴリの最新トピック番号以上の適当な数字」にします。この場合、実際に存在しないトピック番号(削除トピックも含む)についてはサーバがエラーを返しますが、構わずダウンロード! サーバさん、負担掛けてゴメン!
http://message2.nifty.com/tb/board/cocolog/reslist?service_id=debut&board_id=bbs1&mainthread_id=00000[001-999]&gubun_key=mthreadc
「ココログをはじめる前の疑問解決!」のトピック番号「1~999」の「型」指定例
※今思ったんだけど、サーバ内にあるデータベースを使えば、CGI等で「全文検索」が実現できるんじゃないかな?
2.各種テキスト処理
実は「私の得意中の得意」なんですが、テキストエディタを使ってカテゴリ毎に情報を抽出していきます。必要なのは、「タイトル・URL・説明」の3つです。私がどのテキストエディタを使ったかは省略しますが、ここで大活躍するのは「grep」と「正規表現」です。「grep」とは複数ファイル内から指定文字列の位置情報を列挙する機能で、「正規表現」とは文字列をパターン化して表現する手法です。例を挙げれば、「これは○○です」や「これは△△△です」といった「これは(任意の文字列)です」という文字列を「これは.*です」等で表現できます。これを一度知ってしまうと世界が変わります。マリオとスーパーマリオくらい変わると思う(笑)。
この2つを上手く組み合わせれば、必要な情報だけが入手できます。私の場合は、まず「タイトル」と「URL」を抽出して、「説明」は元ファイルから不要な部分(改行も含む)を次々に削除して、置換も一部行っていわゆる消去法で作りました。なお、「1」でサーバが返したエラーファイルについては、この時点で削除しました。その判別は、エラーファイル内に必ず含まれる「~Error」等を検索するとか、他のファイルのように置換保存されないので変更されないタイムスタンプ(=エラーファイル)に注目するとか、いろいろあります。
3.データベースファイルの作成
Excel(表計算ソフト)で新規ブックを作って、各カテゴリ用の3つのシートを用意して、各カテゴリ毎の「タイトル・URL・説明」を貼り付けて、「タイトル」に含まれるトピック番号で昇順にソートします。この時点で、各シートにデータが3列ずつあることになります。次に、「タイトル」列の左横に「data[ data.length ] = {title:"」と入力したデータ列を挿入し(以下同じ)、「URL」列の左横に「",link:"」、「説明」列の左横に「",body:"」、「説明」列の右横に「"};」を挿入します。この時点で、各シートにデータが7列あることになります。その後、全選択コピーしてテキストエディタに貼り付けると各データ間にタブが入るので、そのタブを一括置換で全消去します。これを各シート毎に行い、3つ分を連結します。最後に、1行目に「var data = new Array();」を入力して「search_data.js」というファイル名で保存すれば作成完了です。もっと簡単にできますかね?
4.全文検索窓の設置
「使い方ガイド」のHTML記述(検索窓)とスクリプト(検索機能)を拝借して、サイトHTMLに埋め込みます。ただし、スクリプトの処理はあくまで「使い方ガイド」用になっているので、これを自分のサイト内で表示できるようにスクリプトを修正します。修正したのは「表示位置のID・クラス」と「結果表示の内容・デザイン」くらいで、実処理自体はほとんど流用できました。これで作業は全て完了! しっかり全文検索できているでしょう? うれしいものですね~♪
ここで言っておきたいのは、この実現例は「データベースファイルが命!」ということです。「ファイルをダウンロードした時点での既存Q&A」が検索対象になるので定期的な更新が必要で、テキスト処理をより慎重により正確に行わないと不要な情報が入ったり情報自体が落ちる可能性があります。今回作成したファイルもその点で完全とは言えず、それは認めます。しかしながら、実際の過去ログを元に作成したファイルを使って検索するので、高い精度は備えていると思います。それ故に「ほぼ全文検索窓」という表現を使いました。控えめな自分・・・。
この先のテーマを掲げるのなら、検索した時点での全過去ログを使った「真・全文検索」になるのでしょうか。例えば、検索ボタンを押した時点でファイル群をダウンロードして各種テキスト処理でデータベースを作って検索して結果を表示、という流れになるのかな。各種テキスト処理以降はまあ何とかなると思うけど、問題はファイル群のダウンロードですね。どうやって取得範囲を決めるか、どうやって有効・無効を見極めるか、そこがカギとなります。しかし・・・、それをカバーできる方法があります。話題の技術「Ajax」です。これを駆使すれば、全てがつながりそう! でもスキルが足りない。ガッツも足りない(苦笑)。良く考えたら、ファイルのダウンロードやスクリプトの処理による性能面も考えなければなりません。いくら全文検索ができたって、検索開始から表示完了までに5分も掛かるようなら誰も使いませんよね? でもなんか挑戦してみたいじゃん。壁乗り越えてみたいじゃん。何だか自分の中で盛り上がってきました(笑)。
というわけで、「広場」を楽しむ要素がまた一つ増えました。そう、みんなで解決! 「みんなで解決!広場」向上委員会、委員長でした。
○関連記事『ココログ・「みんなで解決!広場」の不満もみんなで解決!』
【 http://adstv-web.cocolog-nifty.com/studio/2005/12/post_d503.html 】
○関連記事『ココログ・「みんなで解決!広場」向上委員会』
【 http://adstv-web.cocolog-nifty.com/studio/2005/12/post_48db.html 】
○関連記事『ココログ・「みんなで解決!広場」の「よくある質問(FAQ)コーナー」を公開』
【 http://adstv-web.cocolog-nifty.com/studio/2006/02/post_8007.html 】
○関連記事『ココログ・「みんなで解決!広場」のリニューアルに対する意見』
【 http://adstv-web.cocolog-nifty.com/studio/2006/03/post_fe76.html 】
○関連記事『ココログ・「みんなで解決!広場」の「過去ログの自動消失」に対する意見』
【 http://adstv-web.cocolog-nifty.com/studio/2006/04/post_4aaf.html 】
最近のコメント