2011-01-17 11 views
3

私は、pdfbox APIクラスLucenePDFDocumentによって生成されたインデックスを持っています。索引にはテキストの内容のみが含まれているため、この索引を効果的に検索したいと考えています。Lucene - 効果的なテキスト検索

私は検索文字列で 'contents'フィールドを検索します。結果の順序は関連性の低いものから関連性の低いものにする必要があります。以下のコードは、検索されたテキストの単語を含むファイルを表示しました。「あなたの国は何ですか?」ですが、この完全な文を含むファイルは含まれていませんでした。

上記のシナリオで検索するために使用するクエリパーサーとクエリはどのようなものですか。

 Query query = new MultiFieldQueryParser(Version.LUCENE_30, fields, 
       new StandardAnalyzer(Version.LUCENE_30)) 
       .parse(searchString); 

     TopScoreDocCollector collector = TopScoreDocCollector.create(5, 
       false); 
     searcher.search(query, collector); 
     ScoreDoc[] hits = collector.topDocs().scoreDocs; 
     System.out.println("count " + hits.length); 
     for (ScoreDoc scoreDoc : hits) { 
      int docId = scoreDoc.doc; 
      Document d = searcher.doc(docId); 
      System.out.println(d.getField("path")); 
     } 
+1

"以下のコードは期待通りに機能しませんでした。" - あなたが期待するものと実際に得られるものを記述できますか? – ffriend

+0

コードには、検索されたテキストの単語を含むファイルが表示されました。たとえば、「あなたの国籍は?」です。結果にはこのフルテキストを含むファイルが含まれていませんでした。例:somdir/a.pdfにはこの完全な文字列が含まれていましたが、結果には表示されませんでした。 luceneでフルテキスト検索を効果的に実装する方法。 –

答えて

1

プログラム単位ではなく、約Lucene quesry syntaxです。ちょうど二重引用符でそれを包む、つまり代わりに

What is your nationality 

検索

"What is your nationality" 

を検索する引用符なしのLuceneは、それぞれ別々の単語を持つすべてのドキュメントを検索語句全体を検索するには、すなわち「何を」、「あります」、 "あなた"と "国籍"( "is"と "your"は省略され、stop wordsとして省略されるかもしれません)、そのフレーズだけでなく、doc内の全体的な出現数で並べ替えます。 TopScoreDocCollectorに5つまでしか見つからないようにドキュメントの数を設定するので、そのフレーズを含むファイルが結果に表示されないことがあります。引用符を追加するとLuceneは完全なフレーズのない他のすべてのドキュメントを無視します。

「内容」フィールドでのみ検索する場合は、MultiFieldQueryParserの代わりに簡単にQueryParserを使用することができます。