2017.12.15 Friday
スポンサーサイト
一定期間更新がないため広告を表示しています
| スポンサードリンク | - | | - | - |
関口宏司のLuceneブログOSS検索ライブラリのLuceneおよびそのサブプロジェクト(Solr/Tika/Mahoutなど)について
2006.08.09 Wednesday
もうひとつの絞り込み検索(後編)
今回は、図のような「もうひとつの絞り込み検索」機能の一部を構成している、リンクの右隣の「(1000)」の表示方法について説明する。
ところで、図のようなリンクを表示してリンクがクリックされたときに「絞り込み検索」を行う機能を、ノルウェーの検索エンジンの大手FAST社ではDynamic Drill Down(DDD)と呼んでいる。 このDDDの最初のDはDynamicだが、なぜDynamicというのだろう。疑問に思った私は、さっそく同社に勤める友人に聞いてみた。すると、「わかりません。リンクの各カテゴリはあらかじめ用意した静的なものなのですが・・・」ということであった。 さて、今回は次のようなHTMLを出力する方法についてである:
このうち、リンクの部分の出力は前編で解説した。今回は(1000)の部分の出力方法であるが、数字を求めるためには結局のところ、検索をしないとわからない(なーんだ!)。しかしながら、我々が普段使っている「Hitsオブジェクトを戻り値で返すバージョンのsearch()」メソッドをこの場合に使うのは少々負荷がかかるので、このようなときには「HitCollectorを引数に取るバージョンのsearch()」メソッドを用いる。 LuceneのJavadocを見ると、「HitCollectorを引数に取るバージョンのsearch()」メソッドを使うと、スコアがゼロでない(つまり検索質問語にヒットした)ドキュメントひとつひとつに対してHitCollectorのcollect()メソッドが呼ばれる、とある。 そこでこれを利用して、collect()が呼ばれた回数をカウントする次のようなCountHitCollectorクラスを作成する:
CountHitCollectorはcollect()が呼ばれたときにその数をカウントし、getCounter()でカウントした数を返せるようにしている。 このように用意したCountHitCollectorを、次のように生成するリンクの数だけ使用して(1000)の数字の部分を求める:
そして、前編で解説したリンクと上記の数字を組み合わせて最終的なHTMLを得る。 以上がLuceneで実現する「もうひとつの絞り込み検索」機能である。 さて、ここまで書いてみて最初の話に戻って、DDDの最初のDがなぜDynamicなのかという自分なりに解釈してみた。 それは、リンクの部分は静的であるが(もっとも、パラメータqの右辺はURLエンコードされた検索質問語で動的である)、 数字の部分がダイナミックに変わるから、というものであるがどうだろうか。 2006.08.07 Monday
もうひとつの絞り込み検索(前編)
今回は「絞り込み検索」について再考する。「絞り込み検索」をLuceneで実現する方法は「Lucene本」でも紹介したが、ここで説明するのは、それとは異なる「もうひとつの絞り込み検索」である。
最初に、「Lucene本」で紹介されている「絞り込み検索」のオペレーションの流れを復習しておくと、それは次のようである:
以上がこれまでの一般的な「絞り込み検索」機能を使用するときのオペレーションの流れである。 これを実現するための(Web)アプリケーションの実装方法としては、「Lucene本」ではBooleanQueryを使うかまたはQueryFilterを使う方法を紹介し、考察の上BooleanQueryを使って実装する方を推奨している。 しかしながら、このような機能を実装しても、利用者にはあまり使われていないのが現状である。なぜなら最近の利用者は(インターネット)検索することに慣れているため、わざわざ「絞り込み検索」機能を使わなくても、最初から検索窓に第1の検索質問語とスペースを挟んで第2の検索質問語を一度に入力し、[検索]ボタンをクリックするというオペレーションを行うからである。そうしたほうが結果が早く得られるし、クリックする回数も少なくてすむ。 かくして、「検索オプション」(下図。「検索オプション」についてはまた別の回に解説したい)とともに「絞り込み検索」の検索窓(Googleの場合は「絞り込み検索」リンクをクリックした先のページにある)は最も使われない機能のひとつとなっている(もちろん、一部の検索ヘビーユーザには便利な機能であり、はずすことはできない。そのため別リンクとなっているものであろう)。 そこで、この記事では絞り込み条件をあらかじめシステムの方で用意しておき、図のようなリンクで提供する「もうひとつの絞り込み検索」機能をLuceneで実現する方法を紹介しよう。 これは最近になってWeb上のいろいろなサイトで見られる、地味だが利用者の視点に立った親切な機能として採用されだしてきているものだ。 この「もうひとつの絞り込み検索」機能は図を見てわかるとおり、利用者にリンクで提供される。よって、利用者に対しては「絞り込み検索」のための絞り込み用検索質問語の入力の機会を奪う反面、簡単な操作で結果を絞り込むことができる操作性の向上という恩恵も同時に提供している。このように「もうひとつの絞り込み検索」機能は長所(操作性の向上)と短所(自由な絞り込み検索ができない)の両面がある。 しかし、前述の通り検索行為に慣れている最近の利用者にはこの短所の部分はあまり深刻なものとしてとられないだろう。なぜなら、ほとんどの利用者は最初の検索窓への入力で絞り込み条件まで同時に入力しているからである。そのような利用者にとっては、むしろシステムによってあらかじめ用意された上図のような絞り込み条件リンクは自分で絞り込む条件として指定することを思いつかなかった新しい発見であるかもしれない。 「もうひとつの絞り込み検索」機能を提供しているサイトの例 この「もうひとつの絞り込み検索」機能を提供しているサイトを2つ紹介する。 amazon.co.jpの例 Amazonのサイトに行き、検索窓に「ajax」と入力し[GO!]ボタンをクリックする。すると、ヒットした商品一覧が表示されるが、画面左上には図のようなリンクが表示される。 このとき、「Ajaxの日本語の解説書」を探しているのであれば、「和書」のリンクをクリックすれば、目的の商品一覧を簡単に表示できる。 carsensor.netの例 カーセンサーのサイトに行き、「キーワード検索」と表示がある検索窓に「bmw」と入力し[検索]ボタンをクリックする。すると、ヒットした商品一覧が表示されるが、画面左側には図のようなリンクが表示される。 図では「価格帯」が選べるようになっているが、「年式」で選ぶためのリンクも表示される。 Luceneによる「もうひとつの絞り込み検索」機能の実装方法 ではこの機能をLuceneで実現する方法を考えてみよう。「Lucene本」では「(もうひとつではない方の)絞り込み検索」機能はBooleanQueryまたはQueryFilterを使って実装できることを示したが、同じ理屈で「もうひとつの絞り込み検索」機能もBooleanQueryまたはQueryFilterを使って実装できる。しかし、「Lucene本」では「(もうひとつではない方の)絞り込み検索」機能はBooleanQueryを使った方がよいのに対し、「もうひとつの絞り込み検索」機能では逆にQueryFilterを使った方が処理効率がよい。なぜなら、「もうひとつの絞り込み検索」機能はシステムによってあらかじめ絞り込み条件を決めることができ、これはLuceneのQueryFilterのキャッシュが有効に働く利用状況そのものだからである。 さて、「もうひとつの絞り込み検索」機能のプログラムの作業は次の3つある:
ここでの話をわかりやすくするために、絞り込み検索条件は図のようにドキュメントの更新日付で行えるものとする。 すると、1.は次のようなプログラムとなる:
このようにあらかじめ用意したFilterオブジェクトにそれぞれ名前(フィルタ名)をつけておき、Mapなどで管理してフィルタ名でFilterオブジェクトを取得できるようにしておく。 次に2.であるが生成するリンクには、3.で絞り込み検索を行うときに必要な情報を埋め込む必要がある。必要な情報は最低限、最初に入力された検索質問語と、絞り込み条件と一致するフィルタ名である(これ以外にも検索結果一覧表示のための付加情報がいろいろあるがここでは省略する)。具体的には次のようなHTMLが生成されるようにプログラミングを行う:
ここで、パラメータqの値はURLエンコードされた検索質問語、パラメータfの値はフィルタ名である。 最後に、3.は上記のリンクがクリックされたときに実行されるプログラムであるが、パラメータqの値から検索質問語を取得してQueryParserなどでQueryオブジェクトqueryを得る。そしてパラメータfの値からフィルタ名を取得し、1.で用意したMapからFilterオブジェクトfilterを得て次の検索を実行する:
これにより得られたhitsが絞り込み検索をした結果一覧である。 以上がLuceneによる「もうひとつの絞り込み検索」機能の実現方法だ。・・・しかし、ちょっと待った。 サンプルで示したAmazonやカーセンサーのサイトでは、絞り込み検索のリンクの横に(123)というような数字が表示されているではないか。これは「もしその絞り込み検索のリンクをクリックすると、123件のドキュメントまで絞り込めますよ」ということを利用者に示す数字である。この数字の表示は、利用者に「このリンクをクリックするかどうか」の判断材料を提供するという意味でやはり重要な情報である。 この数字をLuceneのプログラムで得ることはもちろん可能であるが、その方法については「もうひとつの絞り込み検索(後編)」で述べることにする。 |
+ Solrによるブログ内検索
+ PROFILE
+ LINKS
+ Lucene&Solrデモ
+ ThinkIT記事
+ RECOMMEND
+ RECOMMEND
Lucene in Action (JUGEMレビュー »)
Erik Hatcher,Otis Gospodnetic,Mike McCandless FastVectorHighlighterについて解説記事を寄稿しました。
+ RECOMMEND
+ SELECTED ENTRIES
+ RECENT COMMENTS
+ RECENT TRACKBACK
+ CATEGORIES
+ ARCHIVES
+ MOBILE
+ SPONSORED LINKS
|
(C) 2024 ブログ JUGEM Some Rights Reserved.
|
PAGE TOP |