2011-01-17 2 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" 

를 검색하는, 큰 따옴표로 포장, "귀하"와 "국적"("is"와 "your"은 생략 할 수 있습니다. stop words)을 포함하여 해당 문구뿐만 아니라 doc에서 발생 횟수를 기준으로 정렬하십시오. TopScoreDocCollector에서 5 개까지만 찾기 위해 문서 수를 설정했기 때문에 문구가있는 파일은 결과에 나타나지 않을 수 있습니다. 따옴표를 추가하면 Lucene이 정확한 구문없이 다른 모든 문서를 무시합니다.

또한 '내용'입력란에서만 검색하는 경우 MultiFieldQueryParser이 필요하지 않으며 간단히 QueryParser을 사용할 수 있습니다.