Lucene

結構簡単に作れそうです.

Lucene のインデックスの構造

インデックスはドキュメントから成ります.
ドキュメントは"メール文書"とか"Webページ"とか,ある構造を持つ一つの文書であると考えればよいか?
ドキュメントはフィールドから成ります.
さらにフィールドはフィールド名とフィールド内容から成ります.
フィールドは例えばメール文書なら to, subject, body だと思えばよいか?
20070211-lucene.png

サンプルプログラム

上記の本のP14?を参考にプログラムを書いてみる.
プログラム全体はこちら

・フィールド名とコンテンツ
フィールド名は fieldとしておく

private static final String FIELD_NAME = "field";

今回はコンテンツをハードコーディング

    private static final String[] contents = {
"すえひろがりっっっ! は Nucleus で構築されている",
"Lucene による検索",
"検索エンジンを Open Source で構築"
};

・indexの生成

        IndexWriter writer = new IndexWriter(dir, analyzer, true);
for (int i = 0; i < contents.length; i++) {
Document doc = new Document();
doc.add(new Field(FIELD_NAME, contents[i], true, true, true));
writer.addDocument(doc);
}
writer.close();
コンテンツをフィールド化してひとつづつドキュメントに格納.
簡単.


・indexの検索

       BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String q = null;
while (q == null || !q.equals("q")) {
System.out.println("n検索質問 >");
System.out.flush();
q = br.readLine();
if(!q.equals("q")) {
IndexSearcher searcher = new IndexSearcher(dir);
Query query = qp.parse(q);
Hits hits = searcher.search(query);
int length = hits.length();
System.out.println(Integer.toString(length) + "件ヒットしました");
for (int i = 0; i < length; i++) {
Document doc = hits.doc(i);
System.out.println("t" + doc.get(FIELD_NAME));
}
searcher.close();
}
}
QueryParser という Lucene で用意されているクエリのパーサを作って検索.
Hits オブジェクトとして検索結果が帰ってくる.
Hits からはドキュメントが取り出せるようになっている.
つまり検索結果はヒットしたドキュメントとして返ってくるということか?

実行

検索質問 > すえひろがり
1件ヒットしました
すえひろがりっっっ! は Nucleus で構築されている
検索質問 > Lucene
1件ヒットしました
Lucene による検索
検索質問 > ほげ
0件ヒットしました
検索質問 > q