FridaySolrにできて、Googleでできないこと前回の記事は、読みようによっては、「Solrでできることは、すべてGoogleでもできる」ととられてしまう可能性もあるので、ここで「Googleではできないが、Solrでできること」もある、ということを具体例で示しておこう。ここでいうGoogleはGoogleアプライアンスをとりあげる。Googleアプライアンスはブラックボックスであるがゆえに楽なことも多いが、インテグレータにとってはカスタマイズできない箱だということが、使用経験のあるインテグレータの間では有名な話だ。よって、Lucene/Solrで得意とするところの検索結果のランキングのカスタマイズが、Googleを採用すると一切できない。OSS検索エンジンであるLucene/Solrはいろいろなプラグインが可能であり、ランキングのカスタマイズは「Googleでできないが、Solrでできる」ことの一例である。いうわけで、Solrでは分散検索でInteger.MAX_VALUEの21億件を超える検索対象文書数を扱うこと(「40億件ヒットしました」と表示する等)はできますが、21億件を越える部分、たとえば『22億件目から10件分』の検索結果を返すことはできません。客「Googleではどうでしょうか?」という話の流れでGoogleで数十億件もヒットする単語を探そうとするが、そのような単語はなかなか見つからない。関口「・・・あと、Solrの分散検索の実装では、『次の10件』を繰り返していき、十分大きな開始オフセットを要求されると、処理時間が非常にかかってしまいます。クライアント側で適当な上限を設けてやる必要があります。客「Googleではどうでしょうか?」またもやGoogleの検索窓に適当な単語を入力してみる。今度は、数百万件ヒットするありふれた単語を思い浮かべるのは簡単で、結果を得ることができた。Googleの検索結果ページ下部の「次の10件」をクリックしていき、開始オフセットを100万件先にまで進めるのは人力では困難である。URLにオフセットを指定する"start"パラメータを使って"start=1000000"と指定すれば、Googleで簡単に開始オフセットを100万にすることができる。そこで"start=1000000"を指定して検索すると、なんと、次のように表示されてしまった:Googleでは1,000件以上先(正確には1,001件以上先?/2008年10月現在)の「検索結果一覧」を要求されても表示しないのだった。これは知りませんでした。Googleの分散検索のシーケンスはSolrと同じなので(というか、事実はSolrがGoogleのシーケンスをまねているので)Googleでも、検索結果一覧の開始オフセットが大きい場合は処理負荷が相当大きくなるため、開始オフセットが大きい検索リクエストには応じない、という選択をしているのだった。「じゃあ、我々もせいぜい数万件表示すればいっか」「Googleができないんだから」というところに落ち着いた。「Googleができないんだから」というセリフは、思えば私は月に1回くらい使っているかもしれない。お客さんも「Googleができないんだったらしょうがないね」と納得してくれる。「GoogleができなくてもSolrではやってくれるよね」というお客さんにはいまだに出会っていない。「Googleができないんだから」は魔法の言葉だ。私は今日からこれを「Google免罪符」と呼ぶことにしよう。比較のポイント商用検索エンジンを購入した企業担当者は読まないでください。McCandlessFastVectorHighlighterについて解説記事を寄稿しました。