2012年12月2日日曜日

lucene 4.0 をまた使ってみた

luceneのプログラミングでおもしろそうなのを見つけたのでまたいじってみた。
このサイト
http://www.lucenetutorial.com/lucene-in-5-minutes.html

サンプルは英語だったのでKuromoji使って日本語でやってみた。
たいして前にアップしたものと変わってないね。
JapaneseAnalyzer使ってるとこ以外変わってないっす。



----------------------------------------

import java.io.IOException;
import java.text.ParseException;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.ja.JapaneseAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopScoreDocCollector;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.Version;


public class HelloLucene {
public static void main(String[] args)throws IOException, ParseException{
  //StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_40);
  Analyzer analyzer = new JapaneseAnalyzer(Version.LUCENE_40);
 
  Directory index = new RAMDirectory();
 
  IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_40, analyzer);
  IndexWriter w = new IndexWriter(index,config);
  addDocument(w, "ルシーン アクション","193398817");
  addDocument(w, "ダミーのルシーン", "55320055Z");
  addDocument(w, "ビッグデータの管理", "55063554A");
  addDocument(w, "コンピュータ科学の芸術", "9900333X");
  w.close();
 
  String querystr = args.length > 0 ? args[0]:"ルシーン";
  Query q = null;

  try {
q = new QueryParser(Version.LUCENE_40, "title",analyzer).parse(querystr);
  } catch (org.apache.lucene.queryparser.classic.ParseException e) {
// ちょっとここはもっとスマートにやれないかと思ったけど調査するのめんどうになった
e.printStackTrace();
  }
  int hitsPerPage = 10;
  IndexReader reader = DirectoryReader.open(index);
  IndexSearcher searcher = new IndexSearcher(reader);
  TopScoreDocCollector collector = TopScoreDocCollector.create(hitsPerPage, true);
  searcher.search(q, collector);
  ScoreDoc[] hits = collector.topDocs().scoreDocs;
 
  System.out.println("Found" + hits.length + "hits.");
  for ( int i = 0 ; i < hits.length ; i++ ){
  int docid = hits[i].doc;
  Document d = searcher.doc(docid);
  System.out.println((i+1) + "." + d.get("isbn") + "\t" + d.get("title"));
  }
  reader.close();
  }

  private static void addDocument(IndexWriter w, String title, String isbn)throws IOException {
// TODO 自動生成されたメソッド・スタブ
    Document doc = new Document();
    doc.add(new TextField("title", title, Field.Store.YES));
    doc.add(new StringField("isbn",isbn,Field.Store.YES));
    w.addDocument(doc);
  }
}

0 件のコメント:

コメントを投稿