2005.09.12 株式会社四次元データ 宮澤了祐
3.2. 検索
検索を行う手順は次の通りです。
- IndexSearcherの作成
- 検索語の取得
- 検索語の解析
- 検索結果の取得
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)メソッドを呼ぶことで、インデックスから検索を行うことが出来ます。