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に移ります。