3. 検索
2005.09.12 株式会社四次元データ 宮澤了祐
3.1. 検索対象となる情報
インデックスを作成する際、インデックスをつける設定が行われていた情報が、検索対象となり得るものです。 コンストラクタを用いるならば第二引数indexがTrueになっているField、 クラスメソッドを用いるならばText()やKeword()メソッドで取得したFieldは、検索対象となり得ます。
doc.add(Field.UnIndexed("url", filepath[i]));
doc.add(new Field("title", title, true, true, false));
doc.add(Field.Text("contents",reader));
上の例では「contents」「title」の名前がついた情報が検索対象となり得ます。 インデックスをつけられた情報は、Termクラスによって保存されています。
org.apache.lucene.index.Term
Termはインデックスをつけた情報の最小単位です。 所属するFieldの名前とその値を持ちます。 形態素解析するように(token = true)Fieldを設定した場合、値を形態素解析されてできた一語一語がTermの値となります。 つまり1つのFieldから複数のTermが作成されることになります。 そうでない場合は、Fieldの値がそのままTermの値となります。
さてインデックスを作成する際にindexをtrueに設定した情報は、Termクラスを通して取得することが出来ます。
IndexReader reader = IndexReader.open(index);
TermEnum terms = reader.terms();
while(terms.next()){
System.out.println(terms.term());
}
TermはIndexReadeの.terms()メソッドにより、Termの集合体「org.apache.lucene.index.TermEnum」として与えられます。 どのTermがどのドキュメントに入っているかの情報は「org.apache.lucene.index.TermDocs」を使用します。
TermDocs termDocs = reader.termDocs(terms.term());
while(termDocs.next()){
System.out.println(termDocs.doc());
System.out.println(termDocs.freq());
}
docメソッドは、そのTermが入っているDocumentのidを返します。 freq()メソッドは、そのTermがそのDocumentの中で何回発生しているかを返します。 next()メソッドで、そのTermが入っている次のDocumentに移ります。

