2016-09-04 3 views
9

현재 내 애플리케이션에서 lucene을 사용하여 자동 제안 부분을 작업 중입니다. 단어의 자동 제안 콘솔 응용 프로그램에서 잘 작동하지만 지금은 웹 응용 프로그램에 정수 있지만 원하는 방식으로 작동하지 않습니다.첫 번째 검색 반복 후 Lucene에서 자동 제안이 작동하지 않습니다.

일부 키워드로 문서를 처음 검색 할 때 검색 및 자동 제안이 모두 잘 작동하고 결과를 표시합니다. 그러나 다른 키워드 또는 동일한 키워드를 다시 검색 할 때 검색 결과뿐만 아니라 자동 제안도 표시되지 않습니다. 나는이 이상한 결과가 왜 나오는지 알 수 없다.

예를 들어
final int HITS_PER_PAGE = 20; 

final String RICH_DOCUMENT_PATH = "F:\\Sample\\SampleRichDocuments"; 
final String INDEX_DIRECTORY = "F:\\Sample\\LuceneIndexer"; 

String searchText = request.getParameter("search_text"); 

BooleanQuery.Builder booleanQuery = null; 
Query textQuery = null; 
Query fileNameQuery = null; 

try { 
    textQuery = new QueryParser("content", new StandardAnalyzer()).parse(searchText); 
    fileNameQuery = new QueryParser("title", new StandardAnalyzer()).parse(searchText); 
    booleanQuery = new BooleanQuery.Builder(); 
    booleanQuery.add(textQuery, BooleanClause.Occur.SHOULD); 
    booleanQuery.add(fileNameQuery, BooleanClause.Occur.SHOULD); 
} catch (ParseException e) { 
    e.printStackTrace(); 
} 


Directory index = FSDirectory.open(new File(INDEX_DIRECTORY).toPath()); 
IndexReader reader = DirectoryReader.open(index); 

IndexSearcher searcher = new IndexSearcher(reader); 
TopScoreDocCollector collector = TopScoreDocCollector.create(HITS_PER_PAGE); 

try{ 
    searcher.search(booleanQuery.build(), collector); 
     ScoreDoc[] hits = collector.topDocs().scoreDocs; 

    for (ScoreDoc hit : hits) { 
     Document doc = reader.document(hit.doc); 
    } 

    // Auto Suggestion of the data 

    Dictionary dictionary = new LuceneDictionary(reader, "content"); 
    AnalyzingInfixSuggester analyzingSuggester = new AnalyzingInfixSuggester(index, new StandardAnalyzer()); 
    analyzingSuggester.build(dictionary); 

    List<LookupResult> lookupResultList = analyzingSuggester.lookup(searchText, false, 10); 
    System.out.println("Look up result size :: "+lookupResultList.size()); 
    for (LookupResult lookupResult : lookupResultList) { 
     System.out.println(lookupResult.key+" --- "+lookupResult.value); 
    } 

    analyzingSuggester.close(); 
    reader.close(); 

}catch(IOException e){ 
    e.printStackTrace(); 
} 

: 첫 번째 반복에서 나는 단어 "샘플"을 검색하는 경우

  • 자동 제안이 나에게주는 다음과 같이 자동 제안뿐만 아니라 검색

    니펫은 결과 : 샘플, 샘플, 샘플러 등 (해당 단어는 문서에 있음)

  • 검색 결과 : 샘플

하지만 같은 텍스트로 다시 검색하거나 결과가 표시되지 않고 LookUpResult 목록 크기가 0이됩니다.

왜 이런 일이 발생하는지 알 수 없습니다. 도와주세요

다음은 문서 집합에서 색인을 생성하기위한 업데이트 된 코드입니다.

final String INDEX_DIRECTORY = "F:\\Sample\\LuceneIndexer"; 
long startTime = System.currentTimeMillis(); 
List<ContentHandler> contentHandlerList = new ArrayList<ContentHandler> (); 

String fileNames = (String)request.getAttribute("message"); 

File file = new File("F:\\Sample\\SampleRichDocuments"+fileNames); 

ArrayList<File> fileList = new ArrayList<File>(); 
fileList.add(file); 

Metadata metadata = new Metadata(); 

// Parsing the Rich document set with Apache Tikka 
ContentHandler handler = new BodyContentHandler(-1); 
ParseContext context = new ParseContext(); 
Parser parser = new AutoDetectParser(); 
InputStream stream = new FileInputStream(file); 

try { 
    parser.parse(stream, handler, metadata, context); 
    contentHandlerList.add(handler); 
}catch (TikaException e) { 
    e.printStackTrace(); 
}catch (SAXException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
finally { 
    try { 
     stream.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

FieldType fieldType = new FieldType(); 
fieldType.setIndexOptions(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS); 
fieldType.setStoreTermVectors(true); 
fieldType.setStoreTermVectorPositions(true); 
fieldType.setStoreTermVectorPayloads(true); 
fieldType.setStoreTermVectorOffsets(true); 
fieldType.setStored(true); 

Analyzer analyzer = new StandardAnalyzer(); 
Directory directory = FSDirectory.open(new  File(INDEX_DIRECTORY).toPath()); 
IndexWriterConfig conf = new IndexWriterConfig(analyzer); 
IndexWriter writer = new IndexWriter(directory, conf); 

Iterator<ContentHandler> handlerIterator = contentHandlerList.iterator(); 
Iterator<File> fileIterator = fileList.iterator(); 

Date date = new Date(); 

while (handlerIterator.hasNext() && fileIterator.hasNext()) { 
Document doc = new Document(); 

String text = handlerIterator.next().toString(); 
String textFileName = fileIterator.next().getName(); 

String fileName = textFileName.replaceAll("_", " "); 
fileName = fileName.replaceAll("-", " "); 
fileName = fileName.replaceAll("\\.", " "); 

String fileNameArr[] = fileName.split("\\s+"); 
for(String contentTitle : fileNameArr){ 
    Field titleField = new Field("title",contentTitle,fieldType); 
    titleField.setBoost(2.0f); 
    doc.add(titleField); 
} 

if(fileNameArr.length > 0){ 
    fileName = fileNameArr[0]; 
} 

String document_id= UUID.randomUUID().toString(); 

FieldType documentFieldType = new FieldType(); 
documentFieldType.setStored(false); 

Field idField = new Field("document_id",document_id, documentFieldType); 
Field fileNameField = new Field("file_name", textFileName, fieldType); 
Field contentField = new Field("content",text,fieldType); 

doc.add(idField); 
doc.add(contentField); 
doc.add(fileNameField); 

writer.addDocument(doc); 

analyzer.close(); 
} 

writer.commit(); 
writer.deleteUnusedFiles(); 
long endTime = System.currentTimeMillis(); 

writer.close(); 

또한 내가 색인 디렉토리에있는 파일을 반복 두 번째 검색에서 삭제하기하고 .SEGMENT 접미사 만 파일이 .segmenta, .segmentb, .segmentc 등

같은 변화를지고 있음을 발견했다

나는이 이상한 상황이 왜 일어나는지 알지 못합니다.

+0

당신은 내 대답을 확인하고 작동하는지 볼 수 있을까요? – coolk

답변

0

코드가 매우 단순 해 보입니다. 따라서 인덱스에 문제가있어 인덱스 생성 방법에 대한 정보를 제공하면 진단하는 데 도움이 될 수 있으므로이 문제가 발생할 수 있습니다. 하지만 정확한 코드는 이번에는 :)

+0

코드를 업데이트했습니다. 한번보세요. – anand

0

나는 writer.deleteUnusedFiles() 호출로 문제가 있다고 생각합니다.

JavaDocs에 따르면이 호출은 "참조되지 않은 색인 커밋을 삭제"할 수 있습니다.

삭제할 색인은 IndexDeletionPolicy입니다. 그러나 "기본 삭제 정책은 KeepOnlyLastCommitDeletionPolicy입니다. 새 커밋이 완료되면 즉시 이전 커밋을 제거합니다 (2.2 이전의 동작과 일치 함)."

"마지막으로 삭제할 때 삭제"에 대해서도 말하고 있는데, 이는이 색인을 사용하고 닫으면 (예 : 검색 중에) 색인이 삭제된다는 것을 의미합니다.

그래서 첫 번째 검색 결과와 일치하는 모든 색인은 즉시 삭제됩니다.

이 시도 :

IndexWriterConfig conf = new IndexWriterConfig(analyzer); 
conf.setIndexDeletionPolicy(NoDeletionPolicy.INSTANCE); 
+0

나는 당신의 스 니펫을 시도했으나 아직도 작동하지 않는다. – anand

관련 문제