目次へ

2005.09.12 株式会社四次元データ 宮澤了祐

3.2. 検索

検索を行う手順は次の通りです。

  1. IndexSearcherの作成
  2. 検索語の取得
  3. 検索語の解析
  4. 検索結果の取得
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.apache.lucene.analysis.ja.JapaneseAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;

public class SampleSearch{
    public static void main(String[] argv) throws IOException, ParseException{
        
        String index;
        if(argv.length != 0){
            index = argv[0];
        }else{
            System.out.println("(使用法):SampleSearcher <インデックスの保存先>");
            return;
        }
        
        IndexSearcher searcher = new IndexSearcher(index);
        JapaneseAnalyzer analyzer = new JapaneseAnalyzer();
        
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        
        while (true) {
                System.out.println("検索語を入力してください:");
                String line = in.readLine();
                if(line.length() == -1)break;
                
                Query query = QueryParser.parse(line, "contents", analyzer);
                
                Hits hits = searcher.search(query);
                System.out.println(hits.length() + " 件見つかりました。"+line);
        
                if(hits.length() != 0){
                    for (int i = 0; i < hits.length(); i++) {
                        Document doc = hits.doc(i);
                        String url = doc.get("url");
                        System.out.println("No."+ i + ":" + url);
                    }
                }
        }
        
        searcher.close();
    }
}

contentsフィールドに含まれる情報を対象に検索を行っています。 「org.apache.lucene.queryParser.QueryParser」は検索文字列を解析するクラスです。形態素解析も行います。 第一引数は検索文字列で、第二引数は対象とするField名、第三引数はアナライザのインスタンスです。

更にQueryParserでは以下の特殊文字を利用できます。 これを用いることで、複雑な検索を実現することができます。

  • 「*」…複数文字に対応するワイルドカード
  • 「?」…一文字に対応するワイルドカード
  • 「+」…指定した語句を含むことを示します。
  • 「-」…指定した語句を含まないことを示します。

Aという単語と、Bという単語両方を含むページを検索したい場合は「+A +B」という検索文を実行する必要があります。

例

「A +B」では、「Bは含むがAは含まないページ」も検索結果に現れてしまいます。つまり、「A +B」の検索結果は、「B」の検索結果と一致してしまいます。 また「A」と「+A」の検索結果も一致します。

「org.apache.lucene.queryParser.Query」には検索条件が入っています。 作成したQueryを引数にIndesSearcherのsearch(Query Query)メソッドを呼ぶことで、インデックスから検索を行うことが出来ます。

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp