2013-12-10 3 views
0

안녕하세요 저는 Java 개발자이자 Lucene을 배우고 있습니다. PDF 클래스 (lucene_in_action_2nd_edition.pdf) 파일과 색인에서 일부 텍스트를 검색하는 검색 클래스를 색인하는 Java 클래스가 있습니다. IndexSearcher은 색인에 문자열이 있음을 나타내는 Document을 제공합니다 (lucene_in_action_2nd_edition.pdf).Lucene에서 검색된 데이터/메타 데이터 가져 오기

하지만 지금은 I want to get searched data or metadata. i.e. I want to know that at which page string is matched, or few text around matched string, etc... 어떻게 할 수 있습니까?

public static void main(String[] args) throws Exception { 
    File indexDir = new File("D:\\index"); 

    String querystr = "Advantages of FastVectorHighlighter"; 
    Query q = new QueryParser(Version.LUCENE_40, "contents", 
      new StandardAnalyzer(Version.LUCENE_40)).parse(querystr); 

    int hitsPerPage = 100; 
    IndexReader reader = DirectoryReader.open(FSDirectory.open(indexDir)); 
    IndexSearcher searcher = new IndexSearcher(reader); 
    TopScoreDocCollector collector = TopScoreDocCollector.create(
      hitsPerPage, true); 
    searcher.search(q, collector); 
    ScoreDoc[] hits = collector.topDocs().scoreDocs; 

    System.out.println("Found " + hits.length + " hits."); 
    for (int i = 0; i < hits.length; i++) { 
     int docId = hits[i].doc; 
     Document d = searcher.doc(docId); 
     System.out.println((i + 1) + "... " + d.get("filename")); 
     System.out.println("====================================================="); 
     System.out.println(d.get("contents")); 


    } 

    // reader can only be closed when there 
    // is no need to access the documents any more. 
    reader.close(); 
} 

여기 d.get("contents") 그는 인덱싱시 저장된, .pdf 파일의 전체 텍스트 (generated by Tika)을 얻었다 :

여기 내 LuceneSearcher.java 클래스입니다.

검색된 텍스트에 대한 정보가 필요하므로 웹 페이지에 강조 표시하거나 검색된 텍스트를 올바르게 강조 표시 할 수 있습니다 (예 : Google 검색 결과). 그것을 성취하는 방법? 우리는 약간의 논리를 작성해야합니까, 아니면 Lucene이 내부적으로할까요?

모든 유형의 도움을 주시면 감사하겠습니다. 미리 감사드립니다.

답변

0

org.apache.lucene.search.highlight 패키지는이 기능을 제공합니다.

예를 들면 :

SimpleHTMLFormatter htmlFormatter = new SimpleHTMLFormatter(); 
Highlighter highlighter = new Highlighter(htmlFormatter, new QueryScorer(query)); 
for (int i = 0; i < hits.length; i++) { 
    int docId = hits[i].doc; 
    Document d = searcher.doc(docId); 
    String text = doc.get("contents"); 
    String bestFrag = highlighter.getBestFragment(analyzer, "contents", text); 
    //output, however you like. 

당신은 또한 당신이 선호하는 경우에, 나는 당신의 응답에 대한 Highlighter API

+0

감사를 참조 대신 하나 하나, 하이 라이터에서 최고의 조각의 목록을 얻을 수 있습니다 또한 형광펜을 적용했습니다. 하지만 완전한 책 (100000 자)이 '텍스트'로 보내지면 500 페이지에서 강조 표시된 텍스트를 보는 것이 매우 어렵습니다. 텍스트를 형광펜으로 보내서 용어를 올바르게 강조 표시하고 직접 사용할 수 있습니다. –

+0

죄송합니다. 설명하신 형광펜의 문제점을 이해하지 못합니다. 형광펜은 텍스트를 단편적으로 제공해야합니다 (단, 달리 설정하지 않은 경우). 왜 500 페이지가 넘는 페이지를보아야합니까? 콘텐츠에서 일치하는 조각을 골라 내고 싶지 않으면 무엇을하고 싶습니까? – femtoRgon