2012年11月12日月曜日

Lucene4.0で検索プログラムを作ってみた


最近Lucene/Solr4.0がリリースされました。検索プログラミングを作ってみたいなと思ったのでやってみました。
⬇このロンウイット関口さんのブログのようにつくってみようかと。
で上記のブログは(たぶん?)1.4のせいか同じようにしてもエラーばっかり。ここだけじゃなくて他のサイトも探してみましたがどこも古いバージョンでエラーばっかりでてこまってました。
まったく、バージョンアップで旧版と互換性がないとかやめてくれよ!(怒)
なんとか他のサイトも見つかりなんとかなった。
⬆すごく助かりました。ありがとうございます。
あってるかわからないんだけど作ったプログラム公開します。
I tried to make sentence search program in java. I got sooooo troublesome problem until achieve it because of no compatibility in each version.
HelloLucene.java
—————start here————————
import java.io.IOException;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.ja.JapaneseAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.FieldType;
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.*;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
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 {
  private static final String FIELD_CONTENT = “content”;
  private static final Directory directory = new RAMDirectory();
  private static final Analyzer analyzer = newJapaneseAnalyzer(Version.LUCENE_40);
  private static final QueryParser qp = newQueryParser(Version.LUCENE_40,FIELD_CONTENT,analyzer);
  private static final String[] contents = {
        “カツオはサザエの弟”“サザエはワカメの姉”“ワカメはカツオの妹”,
        “カツオは長男”“サザエは長女”“ワカメは次女”,
        “マスオはサザエの夫”“波平は舟の夫”“タラちゃんのパパはマスオ”,
        “サザエとマスオは夫婦”“波平はタラちゃんの祖父”“舟はカツオの母”,
        “マスオはカツオの義兄”“カツオはタラちゃんの叔父”“舟はワカメの母”
};
  private static final String[] queries = {
    “カツオ”“ワカメ”“サザエ ワカメ”“サザエ AND ワカメ”“三河屋さん”
};
  public static void main(String[] args)throws IOException, ParseException{
    makeIndex();
    for (int i = 0 ; i < queries.length ; i++ ){
      searchIndex(queries[i]);
    }
    if ( directory != null ){
      directory.close();
    }
  }
  public static void makeIndex() throws IOException {
    // TODO 自動生成されたメソッド・スタブ
    IndexWriterConfig conf = new IndexWriterConfig(Version.LUCENE_40,analyzer);
    IndexWriter writer = new IndexWriter(directory,conf);
    for (int i = 0; i < contents.length ; i++){
      Document doc = new Document();
      FieldType ft = new FieldType();
      //off course this settings for ft are option.
      ft.setStored(true);
      ft.setTokenized(true);
      ft.setIndexed(true);
      doc.add(new Field(FIELD_CONTENTcontents[i],ft));
      writer.addDocument(doc);
    }
    writer.close();
  }
  private static void searchIndex(final String q)throws IOException, ParseException {
    // TODO 自動生成されたメソッド・スタブ
    IndexReader indexreader = DirectoryReader.open(directory);
    IndexSearcher searcher = new IndexSearcher(indexreader);
    Query query = qp.parse(q);
    TopScoreDocCollector results = TopScoreDocCollector.create(100, false);
    searcher.search(query, results);
    TopDocs topdocs = results.topDocs();
    int num = topdocs.totalHits;
    ScoreDoc[] hits = topdocs.scoreDocs;
    System.out.print(”*****query =” + ”” + q + “  “);
    System.out.println(Integer.toString(num) + “件ヒット”);
    for (ScoreDoc hit : hits){
    Document doc = searcher.doc(hit.doc);
    System.out.println(doc.get(FIELD_CONTENT));
  }
}
—————End——————-

0 件のコメント:

コメントを投稿