2011-06-24 9 views
1

私はLuceneを初めて使い、検索後にヒットカウントを取得しようとすると失われます。助けてください。 ところで、私はNetbeans IDEを使用しています。事前におかげで助けてください。Lucene 3.0 - 正しいヒットカウントが得られないのはなぜですか?

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package pdflucene; 

/** 
* 
* @author nigel 
*/ 


import java.io.IOException; 


import org.apache.lucene.analysis.standard.StandardAnalyzer; 
import org.apache.lucene.document.Document; 
import org.apache.lucene.document.Field; 

import org.apache.lucene.index.IndexWriter; 
import org.apache.lucene.index.IndexWriterConfig; 
import org.apache.lucene.index.Term; 
import org.apache.lucene.search.IndexSearcher; 
import org.apache.lucene.search.TermQuery; 
import org.apache.lucene.store.RAMDirectory; 
import org.apache.lucene.util.Version; 
import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.util.PDFTextStripper; 


public class ExtractPageContent { 


public static final String inn = "/Users/nigel/Desktop/Statement_Week9/AlanWilder.pdf"; 
public static final String PATH = "/Users/nigel/Desktop/Statement_Week9"; 



public void parsePdf(String pdf) throws IOException { 
    String ts=""; 
    String content=""; 
    String [] queryStrings; 

try{ 
    String temp = ""; 
    PDDocument pdfdocument = PDDocument.load(pdf); 
    Integer n=pdfdocument.getNumberOfPages(); 
    PDFTextStripper stripper = new PDFTextStripper(); 

    RAMDirectory idx = new RAMDirectory(); 
    stripper.setStartPage(1); 
    stripper.setEndPage(4); 
    stripper.setSortByPosition(false); 

    pdfdocument.close(); 

    IndexWriterConfig conf = new IndexWriterConfig(Version.LUCENE_30, new StandardAnalyzer(Version.LUCENE_30)); 
    IndexWriter writer = new IndexWriter(idx, conf); 
    Document mydoc = new Document(); 
    mydoc.add(new Field("content", "Alan is Alan not quite alan",Field.Store.NO,Field.Index.ANALYZED)); 

    writer.addDocument(mydoc) ; 
    writer.close(); 


    IndexSearcher ss=new IndexSearcher(idx,true); 
    Term t = new Term("content", "Alan"); 
    TermQuery pq= new TermQuery(t); 


    int results = ss.search(pq,1).totalHits; 
    System.out.println("total hits: " + results); 


    ss.close(); 

    System.out.println("number of pages " + n); 
    }catch(Exception e){ 
     System.out.println("Something Wrong at "+e.getMessage()); 
    } 



} 



/** 
* Main method. 
* @param args no arguments needed 
* @throws IOException 
*/ 
    public static void main(String[] args) throws IOException { 
    new ExtractPageContent().parsePdf(inn); 
    } 
} 
+0

特にどのような問題がありますか?それは例外を発生させますか? – mamoo

答えて

0

ヒット数がゼロになるのは、情報をインデックスする方法とクエリの方法が異なるからです。

情報をインデックス化するときは、内部でLowerCaseFilterを使用するStandardAnalyzerを使用し、すべてのデータがインデックス内で小文字になります。

クエリを実行すると、用語値を小文字にしない「生」クエリ(TermQueryを使用)を構築します。あなたは

Term t = new Term("content", "alan"); 

にライン

Term t = new Term("content", "Alan"); 

変わってしまう場合は、望ましい結果を得るでしょう。明らかに、これは悪いアプローチである - あなたは、例えば、クエリを解析し、同じアナライザを再利用することで同じことを達成したい。:

Query q = MultiFieldQueryParser.parse(
        Version.LUCENE_30, 
        "content:Alan", 
        new String[]{"content"}, 
        new BooleanClause.Occur[] {BooleanClause.Occur.SHOULD}, 
        analyzer 
); 

あなたはおそらく、クエリの異なるタイプを使用することができますが、アイデアを得ました。

P.S.次回は、問題に関係のない情報(PDFファイル)を含めないでください。

関連する問題