関口宏司のLuceneブログ

OSS検索ライブラリのLuceneおよびそのサブプロジェクト(Solr/Tika/Mahoutなど)について
<< BEA dev2dev オフラインミーティング セミナー資料 | main | もうひとつの絞り込み検索(後編) >>
もうひとつの絞り込み検索(前編)
今回は「絞り込み検索」について再考する。「絞り込み検索」をLuceneで実現する方法は「Lucene本」でも紹介したが、ここで説明するのは、それとは異なる「もうひとつの絞り込み検索」である。

最初に、「Lucene本」で紹介されている「絞り込み検索」のオペレーションの流れを復習しておくと、それは次のようである:


  1. 最初の検索質問語を検索窓に入力し、[検索]ボタンをクリック

  2. 検索質問語がヒットしたドキュメントの一覧が表示される。その検索結果一覧ページに表示されている「絞り込み検索窓」に絞り込み検索をする検索質問語を入力し、[絞り込み検索]ボタンをクリック

  3. 最終的に、入力した2つの検索質問語が両方とも含まれる検索結果一覧が表示される。なお、「検索質問語」はフレーズや2語以上からなるものでもかまわない



以上がこれまでの一般的な「絞り込み検索」機能を使用するときのオペレーションの流れである。

これを実現するための(Web)アプリケーションの実装方法としては、「Lucene本」ではBooleanQueryを使うかまたはQueryFilterを使う方法を紹介し、考察の上BooleanQueryを使って実装する方を推奨している。

しかしながら、このような機能を実装しても、利用者にはあまり使われていないのが現状である。なぜなら最近の利用者は(インターネット)検索することに慣れているため、わざわざ「絞り込み検索」機能を使わなくても、最初から検索窓に第1の検索質問語とスペースを挟んで第2の検索質問語を一度に入力し、[検索]ボタンをクリックするというオペレーションを行うからである。そうしたほうが結果が早く得られるし、クリックする回数も少なくてすむ。

かくして、「検索オプション」(下図。「検索オプション」についてはまた別の回に解説したい)とともに「絞り込み検索」の検索窓(Googleの場合は「絞り込み検索」リンクをクリックした先のページにある)は最も使われない機能のひとつとなっている(もちろん、一部の検索ヘビーユーザには便利な機能であり、はずすことはできない。そのため別リンクとなっているものであろう)。

検索オプション

そこで、この記事では絞り込み条件をあらかじめシステムの方で用意しておき、図のようなリンクで提供する「もうひとつの絞り込み検索」機能をLuceneで実現する方法を紹介しよう。

これは最近になってWeb上のいろいろなサイトで見られる、地味だが利用者の視点に立った親切な機能として採用されだしてきているものだ。

もうひとつの絞り込み検索機能

この「もうひとつの絞り込み検索」機能は図を見てわかるとおり、利用者にリンクで提供される。よって、利用者に対しては「絞り込み検索」のための絞り込み用検索質問語の入力の機会を奪う反面、簡単な操作で結果を絞り込むことができる操作性の向上という恩恵も同時に提供している。このように「もうひとつの絞り込み検索」機能は長所(操作性の向上)と短所(自由な絞り込み検索ができない)の両面がある。

しかし、前述の通り検索行為に慣れている最近の利用者にはこの短所の部分はあまり深刻なものとしてとられないだろう。なぜなら、ほとんどの利用者は最初の検索窓への入力で絞り込み条件まで同時に入力しているからである。そのような利用者にとっては、むしろシステムによってあらかじめ用意された上図のような絞り込み条件リンクは自分で絞り込む条件として指定することを思いつかなかった新しい発見であるかもしれない。

「もうひとつの絞り込み検索」機能を提供しているサイトの例

この「もうひとつの絞り込み検索」機能を提供しているサイトを2つ紹介する。

amazon.co.jpの例

Amazonのサイトに行き、検索窓に「ajax」と入力し[GO!]ボタンをクリックする。すると、ヒットした商品一覧が表示されるが、画面左上には図のようなリンクが表示される。

Amazonの絞り込み検索

このとき、「Ajaxの日本語の解説書」を探しているのであれば、「和書」のリンクをクリックすれば、目的の商品一覧を簡単に表示できる。

carsensor.netの例

カーセンサーのサイトに行き、「キーワード検索」と表示がある検索窓に「bmw」と入力し[検索]ボタンをクリックする。すると、ヒットした商品一覧が表示されるが、画面左側には図のようなリンクが表示される。

カーセンサーの絞り込み検索

図では「価格帯」が選べるようになっているが、「年式」で選ぶためのリンクも表示される。

Luceneによる「もうひとつの絞り込み検索」機能の実装方法

ではこの機能をLuceneで実現する方法を考えてみよう。「Lucene本」では「(もうひとつではない方の)絞り込み検索」機能はBooleanQueryまたはQueryFilterを使って実装できることを示したが、同じ理屈で「もうひとつの絞り込み検索」機能もBooleanQueryまたはQueryFilterを使って実装できる。しかし、「Lucene本」では「(もうひとつではない方の)絞り込み検索」機能はBooleanQueryを使った方がよいのに対し、「もうひとつの絞り込み検索」機能では逆にQueryFilterを使った方が処理効率がよい。なぜなら、「もうひとつの絞り込み検索」機能はシステムによってあらかじめ絞り込み条件を決めることができ、これはLuceneのQueryFilterのキャッシュが有効に働く利用状況そのものだからである。

さて、「もうひとつの絞り込み検索」機能のプログラムの作業は次の3つある:


  1. システムであらかじめ決めた絞り込み条件を表現するFilterを用意しておく

  2. 検索質問語が入力された後に表示するページ(検索結果一覧ページなど)に、絞り込み検索条件を列挙したリンクを生成する

  3. 絞り込み条件のリンクがクリックされたときに、条件にあった絞り込み検索を実行する



ここでの話をわかりやすくするために、絞り込み検索条件は図のようにドキュメントの更新日付で行えるものとする。

日付による絞り込み

すると、1.は次のようなプログラムとなる:



// 絞り込み検索 2006-2005 のためのFilterオブジェクトの生成
Query q0506 = new RangeQuery( new Term( "year", "2005" ), new Term( "year", "2006" ), true );
Filter f0506 = new QueryFilter( q0506 );

// 絞り込み検索 2004-2003 のためのFilterオブジェクトの生成
Query q0304 = new RangeQuery( new Term( "year", "2003" ), new Term( "year", "2004" ), true );
Filter f0304 = new QueryFilter( q0304 );

// 絞り込み検索 2002-2001 のためのFilterオブジェクトの生成
Query q0102 = new RangeQuery( new Term( "year", "2001" ), new Term( "year", "2002" ), true );
Filter f0102 = new QueryFilter( q0102 );



このようにあらかじめ用意したFilterオブジェクトにそれぞれ名前(フィルタ名)をつけておき、Mapなどで管理してフィルタ名でFilterオブジェクトを取得できるようにしておく。

次に2.であるが生成するリンクには、3.で絞り込み検索を行うときに必要な情報を埋め込む必要がある。必要な情報は最低限、最初に入力された検索質問語と、絞り込み条件と一致するフィルタ名である(これ以外にも検索結果一覧表示のための付加情報がいろいろあるがここでは省略する)。具体的には次のようなHTMLが生成されるようにプログラミングを行う:



<a href="query?q=%28%E4%B9%9D%E5%B7%9E%29&amp;f=f0506">2006-2005</a>
<a href="query?q=%28%E4%B9%9D%E5%B7%9E%29&amp;f=f0304">2004-2003</a>
<a href="query?q=%28%E4%B9%9D%E5%B7%9E%29&amp;f=f0102">2002-2001</a>



ここで、パラメータqの値はURLエンコードされた検索質問語、パラメータfの値はフィルタ名である。

最後に、3.は上記のリンクがクリックされたときに実行されるプログラムであるが、パラメータqの値から検索質問語を取得してQueryParserなどでQueryオブジェクトqueryを得る。そしてパラメータfの値からフィルタ名を取得し、1.で用意したMapからFilterオブジェクトfilterを得て次の検索を実行する:



Hits hits = searcher.search( query, filter );



これにより得られたhitsが絞り込み検索をした結果一覧である。

以上がLuceneによる「もうひとつの絞り込み検索」機能の実現方法だ。・・・しかし、ちょっと待った。

サンプルで示したAmazonやカーセンサーのサイトでは、絞り込み検索のリンクの横に(123)というような数字が表示されているではないか。これは「もしその絞り込み検索のリンクをクリックすると、123件のドキュメントまで絞り込めますよ」ということを利用者に示す数字である。この数字の表示は、利用者に「このリンクをクリックするかどうか」の判断材料を提供するという意味でやはり重要な情報である。

この数字をLuceneのプログラムで得ることはもちろん可能であるが、その方法については「もうひとつの絞り込み検索(後編)」で述べることにする。
| 関口宏司 | Lucene自由自在 | 09:22 | comments(1) | trackbacks(0) |
http://www.birkenstocksandalssale.us.com/ birkenstock outlet
http://www.hermesbirkin-handbags.us.com/ hermes birkin bag
http://www.fitflopsshoes.us.com/ fitflop
http://www.louboutinredbottoms.us.com/ red bottoms
http://www.katespadepurses.us.com/ kate spade tote
http://www.adidas-ultraboost.us.com/ adidas ultra uncaged
http://www.longchampbag.us.com/ longchamp
http://www.pandorajewelryscharms.us.com/ pandora rings
http://www.fitflops-sale.us.com/ fitflop uk
http://www.nikeairvapormaxflyknit.us.com/ nike basketball shoes
http://www.adidasnmdrunnerr1.us.com/ adidas nmd
http://www.lebron15-shoes.us.com/ kyrie irving shoes
http://www.jordans11shoes.us.com/ jordan 10
http://www.curry4-shoes.us.com/ stephen curry
http://www.airmax90shoes.us.com/ air max 90
http://www.jordan11spacejams.us.com/ jordan space jams
http://www.adidasyeezy-350.us.com/ yeezy boost 750
http://www.salomonspeedcross3.us.com/ salomon
http://www.nikeairmax-90.us.com/ air max thea
http://www.pumafentyrihannashoes.us.com/ puma running shoes
http://www.yeezyboost350shoes.us.com/ yeezy 750
http://www.pandora-jewelrysale.us.com/ pandora jewelry official site
http://www.pandorajewelryrings.us.com/ pandora bracelet
http://www.kd10-shoes.us.com/ kd
http://www.kyrie-4.us.com/ kyrie 3
ドリフトliuyuzhen
| nike air vapormax | 2018/03/24 8:53 AM |









http://lucene.jugem.jp/trackback/90
+ Solrによるブログ内検索
+ PROFILE
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
<< December 2018 >>
+ LINKS
検索エンジン製品 - 比較のポイント
商用検索エンジンを購入した企業担当者は読まないでください。ショックを受けますから・・・
>>製品比較 10のポイント
+ Lucene&Solrデモ
+ ThinkIT記事
+ RECOMMEND
Apache Solr入門 ―オープンソース全文検索エンジン
Apache Solr入門 ―オープンソース全文検索エンジン (JUGEMレビュー »)
関口 宏司,三部 靖夫,武田 光平,中野 猛,大谷 純
+ RECOMMEND
Lucene in Action
Lucene in Action (JUGEMレビュー »)
Erik Hatcher,Otis Gospodnetic,Mike McCandless
FastVectorHighlighterについて解説記事を寄稿しました。
+ RECOMMEND
+ SELECTED ENTRIES
+ RECENT COMMENTS
+ RECENT TRACKBACK
+ CATEGORIES
+ ARCHIVES
+ MOBILE
qrcode
+ SPONSORED LINKS