「Apache Solr」(以下Solr)は、Javaで記述された高速検索サーバの1つです。
http://lucene.apache.org/solr/
CNET Networks社により"Solar"として開発された後、2006年1月にApacheコミュニティに寄贈され、"Solr"と名前を変えました。2007年1月よりApache Lucene のサブプロジェクトとなっています。
以下のような特徴が挙げられます。(本稿はSolr3.xを基に記述しています。)
Solrは、インデクス作成時に文書を解析して単語に切り分け、単語ごとにそれが含まれている文書の情報を記録しておきます。このようなインデクスを転置インデクスと言います。
あらかじめ転置インデクスを作成しておくことで、ある単語で検索した時に、その単語がどの文書に含まれているのかをすぐに探しだすことができます。インデクスの作成には時間を要しますが、一旦インデクスを作成した後は、高速に検索できるのが利点です。
インデクスを作成する際に必要となるのが文書の解析です。以下、主に日本語文章の解析に用いられる形態素解析とN-Gram法について説明をします。システムへの実装においては、それぞれの特徴を生かしながら、両者を組み合わせて使用することも可能です。
「形態素」とは、言語において意味のある最小の単位を意味します。形態素解析は、辞書などを用い文脈や単語などを解析し、「形態素」に区切ってインデクスを作成する方法です。後述するN-Gramに比べて、生成されるインデクスのサイズが小さいのが特徴です。また、検索時に意図しない結果がヒットすることが少ない半面、検索漏れが発生することがあります。
「国立国会図書館は、出版物を中心に国内外の資料・情報を広く収集しています」
N-Gramは、文脈や単語を考慮せず、文字数の単位(N=2の場合は2文字毎)で文字を分解する方法です。検索に漏れが発生しない一方で、検索結果にノイズが多くなったり、インデクスのサイズが肥大化したりする傾向があります。
「国立国会図書館は、出版物を中心に国内外の資料・情報を広く収集しています」
Solrは、検索結果を「適合度(Score)」によって順序付けます。適合度の算出は、「tf-idf」と呼ばれる方法で、文章中の単語の重み付けを行います。「tf-idf」とは、単語の出現頻度TF(Term Frequency)と、全文書中の単語の集中度合いIDF(Inverse Document Frequency)を掛け合わせることにより適合度を算出する方法です。
各単語について、IDF(log{全文書数÷単語の出現する文書数})を算出した後、TFとIDFを掛け合わせて適合度を算出します。
検索対象の単語が、ある文書中に高頻度で出現していたとしても、その単語が他の文書中にも多く存在する場合は、当該文書に含まれる単語の適合度は低くなります。
例えば、「鉄道」と「物資」の二つの単語に注目してみましょう。「鉄道」は文書1に3回出現し、他は文書5に1回のみ出現します。一方、「物資」は文書5に5回出現しますが、他の文書にも多く出現しています。文書1「鉄道」と、文書5「物資」を比較すると、出現回数は、
5(文書5「物資」)>3(文書1「鉄道」)
ですが、適合度は以下のように逆転します。
1.191(文書1「鉄道」)>0.48(文書5「物資」)
また、「鉄道」と「物資」で掛け合わせ検索をした際の適合度は、合算して、
1.383(文書1)>0.877(文書5)
となり、文書1の適合度が高くなります。
Solrで検索をした際には、この適合度の順で、検索結果の表示を並び替えることができます。
(最終更新日:2013/10/29)