みなさん、こんにちは。lunettesチームの的場です。 前回に引き続き、全文検索システム「Solr」を紹介していきます。

全文検索の仕組み

全文検索では検索を高速に行うため、あらかじめ転置インデックスというデータを作成しておく必要があります。

転置インデックスは専門書の最後の方に付く索引をイメージしてもらえばわかりやすく、どのような言葉がどの文書のどの位置に存在するかを記録したデータです。

作成された転置インデックスは特定の順序で並べられており、検索で指定された文字や文章が索引に存在するかを高速に調べ、存在する場合はどの文書内に検索したい文字や文章が含まれているか取得することが出来ます。

転置インデックスの作り方

転置インデックスを作る際に一番問題となるのは単語の検出方法です。英語のような言語ではスペースで単語が区切られているため、単語の検出が容易ですが、日本語ではどこまでを一つの単語として扱うかは課題が多いです。

日本語における転置インデックスの作成方法としては形態素解析を用いる方法とN-gramを用いる場合があります。

形態素解析による単語検出

形態素解析は辞書に登録してある単語に基づいて単語を検出する方法です。

例えば、「アットウェアは神奈川県横浜市西区みなとみらいに所在しています」という文章に形態素解析処理をすると以下のようになります。

  • アット(名詞)
  • ウェア(名詞)
  • は(助詞)
  • 神奈川県(名詞)
  • 横浜市(名詞)
  • 西区(名詞)
  • みなとみらい(名詞)
  • に(助詞)
  • 所在(名詞)
  • し(助動詞)
  • て(助詞)
  • い(助動詞)
  • ます(助動詞)

形態素解析は辞書に載っている単語で区切りますので、この辞書にはアットウェアは登録されていないようですね。アットウェアが辞書登録されていれば、アットウェアのひとかたまりで名詞として検出されます。

形態素解析を使うことによりこの文書に含まれている単語は「アット」「ウェア」「神奈川県」「横浜市」「西区」「みなとみらい」「所在」などであることがわかり、それらを転置インデックスに登録することにより、その単語が含まれる文書を高速に探すことが出来るようになります。

n-gramによる単語検出

n-gramは意味のある単語は意識せずに、文字数で文章を区切って単語を検出する方法です。 1文字で区切る場合はuni-gram、2文字で区切るbi-gramと呼びます。

bi-gramで「神奈川県」という単語を区切った場合は「神奈」「奈川」「川県」という単語が検出されます。

検索で指定された言葉もbi-gramで区切って検索するので「神奈川」で検索した場合は「神奈」と「奈川」が含まれる文書を探すことになります。

それぞれの特徴

形態素解析のメリットとしては「n-gramに比べて転置インデックスのデータ量が小さい」点で、デメリットとしては「検索漏れがある」があります。

n-gramのメリットとしては「検索漏れがない」点で、デメリットは「転置インデックスのデータ量が大きい」「検索ノイズが多くなる」になります。

検索漏れと検索ノイズについては重要な内容ですので、次回詳しく説明します。