Lucene 3.0 - почему я не могу получить правильный счетчик посещений? - PullRequest
1 голос
/ 24 июня 2011

Я новичок в Lucene, и я теряюсь, когда я пытаюсь получить количество просмотров после поиска.Пожалуйста помоги.Кстати, я использую Netbeans IDE.Заранее спасибо за помощь.

/*
* 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);
  }
}

1 Ответ

0 голосов
/ 24 июня 2011

Причина, по которой вы получаете ноль хитов, заключается в том, что способы индексирования информации и способы запроса отличаются.

Когда вы индексируете свою информацию, вы используете StandardAnalyzer, который внутренне использует LowerCaseFilter, и все ваши данные располагаются в нижнем регистре внутри индекса.

Когда вы делаете запрос, вы создаете «необработанный» запрос (используя 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...