日本語全文検索をする為の考え方

N−gramとは
「N文字インデックス法」「Nグラム法」などともいう。検索対象を単語単位ではなく文字単位で分解し、後続の N-1 文字を含めた状態で出現頻度を求める方法。Nの値が1なら「ユニグラム(uni-gram)」、2なら「バイグラム(bi-gram)」、3なら「トライグラム(tri-gram)」と呼ばれる。たとえば「全文検索技術」という文字列の場合、「全文」「文検」「検索」「索技」「技術」「術(終端)」と2文字ずつ分割して索引化を行ってやれば、検索漏れが生じず、辞書の必要も無い。しかし形態素解析によるわかち書きに比べると、意図したものとは異なる検索結果(検索ノイズ=「京都」で検索すると「東京都庁」がヒットするなど)が生じることが多く、インデックスのサイズも肥大化しがちであることが欠点とされる。(wikipediaより)

つまり、どういう事かというと、検索対象となるデータの内容から事前に索引を作ってしまえという事です。もちろんデータは膨大になります。でもどうせgoogleさんのサーバを無料で利用しますからね(笑)

例)
百人一首から、小野小町の「花の色は移りにけりないたづらに わが身世にふるながめせしまに」という一首が検索対象だとすると、
索引を以下のように作成します。

 トライグラム(3文字)
  1件目    :【花の色】
  2件目    :【の色は】
  3件目    :【色は移】
  4件目    :【は移り】
  5件目    :【移りに】
   :
  途中省略
   :
  最後から2件目:【しまに】
  最後から1件目:【まに】
  最後     :【に】

そして、この索引のデータとして、対照データのキー(実際のキーでなくとも、ユニークに検索可能ならばOK)を保存し、それを元に検索結果を返すという事をするわけです。

全文検索での、N−Gram とは別に形態素解析というのもあって、辞書を利用して、語・単語(word)単位で分けて索引を作成するというのもあります。そして、この二つを利用して検索するのがBESTだとされています。
しかしこの形態素解析は、日本語向けではありません。というのも、英語は、word の間に通常空白が入りますが、日本語は副詞だとか接尾語だとか、色々と面倒なものが付いていたりします。しかも日本語の辞書が少ないらしく、英語のように簡単に区切るのが難しいようです。
そこで、N−gramだけで作ってしまおうと思ったわけですが、
どうせならば、このNーgramのNを2とか3とか固定にせずに、文章の最後までを索引にしてしまおうと考えたわけです。
そうすれば、後はその検索する内容の頭からの桁数だけ比較していけば、欲しいデータが検索可能となるはずです。

例)
上記の一首から索引は、以下のように作成します。

  1件目    :【花の色は移りにけりないたづらに わが身世にふるながめせしまに】
  2件目    :【の色は移りにけりないたづらに わが身世にふるながめせしまに】
  3件目    :【色は移りにけりないたづらに わが身世にふるながめせしまに】
  4件目    :【は移りにけりないたづらに わが身世にふるながめせしまに】
  5件目    :【移りにけりないたづらに わが身世にふるながめせしまに】
   :
  途中省略
   :
  最後から2件目:【しまに】
  最後から1件目:【まに】
  最後     :【に】

こうして、先頭から検索文字数分だけ、同じ内容のデータを探し出せば、完璧ではありませんか?
(もちろん、ノイズは防げませんが…)
これが、日本語全文検索の考え方です。

この検索のやり方であれば、複数文字列のAND 条件での検索も、そんなに難しくはありません。
検索する際に、条件を付加するだけです。(おそらく、SQL の IN 条件と同じやり方で上手くいくと思われます)