2009-09-02 14 views
1

私はさまざまなセクションの大きな文書を持っています。各セクションには、関心のあるキーワード/フレーズのリストがあります。私は文字列の配列として格納されているキーワード/フレーズのマスターリストを持っています。どのようにしてSolrまたはLuceneを使用して、各セクション文書ですべてのキーワードを検索し、どのキーワードが見つかったのかを教えてください。私はあなたがこのインデックスに助けるべきであるかのLuceneインデックス、学びます、プログラムを実行しているbasicsキーワードのリストを検索して、存在するかどうかを調べる

と....これを実装する任意の簡単な方法で

おかげ

+0

バックナンバーのブックインデックスを作成しようとしていますか?これは一回限りの実行ですか、または時間の経過とともに索引を検索しますか?あなたが意味することの短い例を挙げてください(2つのセクション、それぞれに2つのキーワード、必要な入力と出力)。 –

答えて

1

スタートを考えるカントフィールドを含む文書を検索する

あなたのデータについて、フィールドがどのように必要であるか、フィールドがどのように必要かを決定します。stored、。すなわち、 DateFieldsは] = 代わりでは現在次のステップは

//indexmap ==> HashMap 
//keywordfields ==> you master list of keywords/phrases 
//selectfields ==> your document field (contained in lucene index) 
String[] keywordfields = (String[]) indexmap.get("keywordfields").toString().split(","); 
String[] selectFields = (String[]) indexmap.get("indexfields").toString().split(","); 
//create a booleanquery 
BooleanQuery bq = new BooleanQuery(); 
//iterate the keywordfields 
for (int i = 0; i < keywordfields.length; i++) { 
    bq.add(new BooleanClause(new TermQuery(new Term(keywordfields[i], (String)params.get(SEARCH_QUERYSTRING))),BooleanClause.Occur.SHOULD)); 
       } 
//pass the boolean query object to the indexsearcher 
topDocs = indexSearcher.search(rq, 1000); 
//get a reference to ScoreDoc 
ScoreDoc[] hits = topDocs.scoreDocs; 
//Iterate the hits 

    Map <String, Object> resultMap = new HashMap<String, Object>(); 
    List<Map<String, String>> resultList = new ArrayList<Map<String, String>>(); 
        for (ScoreDoc scoreDoc : hits) { 
        int docid = scoreDoc.doc; 
        FieldSelector fieldselector = new MapFieldSelector(selectFields); 
        Document doc = indexSearcher.doc(docid, fieldselector); 

        Map<String, String> searchMap = new HashMap<String, String>(); 
        // get all fields for documents we got 
        List<Field> fields = doc.getFields(); 
        for (Field field : fields) { 
         searchMap.put(field.name(), field.stringValue()); 
         System.out.println("Field Name:" + field.name()); 
         System.out.println("Field value:" + field.stringValue()); 
        } 
        resultList.add(searchMap); 
        resultMap.put(TOTAL_RESULTS, hits.length); 
        resultMap.put(RS, resultList); 
       }    
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

これはLuceneのを使用して実装の一つでなければならないものでなければならない

をField.Index.ANALYZED Field.Index.NOT_ANALYZEDとして格納されなければならない

+0

ありがとうございます。私たちはSolrを中心に決めました。 Solrjを使って、誰かが親切にSolrの例を提供できますか? 私のキーワードは、1つのキー(例えばSolr)または2つのキー(例えばApache Lucene)の5つのキーまでです。例えば(Apache Lucene Web Service Deploy) –

0

あなたが知っているのは、Luceneの分析機能です。この機能の中心にはAnalyzerクラスがあります。ドキュメントから:

アナライザは、テキストを分析するTokenStreamsを構築します。従って、テキストから索引用語を抽出するための方針を表す。

ありから選択する多くのAnalyzerのクラスがありますが、StandardAnalyzerは通常は良い仕事をしていません:

// For each chapter... 

Reader reader = ...; // You are responsible for opening a reader for each chapter 
Analyzer analyzer = new StandardAnalyzer(); 
TokenStream tokenStream = analyzer.tokenStream("", reader); 

Token token = new Token(); 
while ((token = tokenStream.next(token)) != null)) { 
    String keyword = token.term(); 
    // You can now do whatever you wish with this keyword 
} 

あなたは、他のアナライザは、あなたの目的のために、より良い仕事をすることがあります。

関連する問題