2016-09-04 4 views
9

Derzeit arbeite ich an der Auto Vorschlag Teil mit Lucene in meiner Anwendung. Der automatische Vorschlag der Wörter funktioniert gut in der Konsolenanwendung, aber jetzt habe ich in die Webanwendung integriert, aber es funktioniert nicht in der gewünschten Weise.Auto Suggestion funktioniert nicht in Lucene nach der ersten Suche Iteration

Wenn die Dokumente nach dem ersten Mal mit einigen Schlüsselwörtern gesucht werden, funktionieren Suche und automatischer Vorschlag beide gut und zeigen das Ergebnis an. Aber wenn ich wieder nach einem anderen Schlüsselwort oder dem gleichen Schlüsselwort suche, werden sowohl der automatische Vorschlag als auch das Suchergebnis nicht angezeigt. Ich bin nicht in der Lage herauszufinden, warum dieses merkwürdige Ergebnis kommt.

Die Schnipsel für die Auto-Suggestion sind sowie Suche wie folgt:

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(); 
} 

Für Ex: In erster Iteration, wenn i für Wort "Probe"

  • Auto Vorschlag mir zu suchen gibt Ergebnis: Probe, Proben, Sampler usw. (Dies sind die Wörter in den Dokumenten)
  • Suchergebnis als: Beispiel

Aber wenn ich es wieder mit demselben Text oder anders suche, zeigt es kein Ergebnis und auch LookUpResult Listengröße kommt Null.

Ich verstehe nicht, warum das passiert. Bitte helfen Sie

Unten ist der aktualisierte Code für die Indexerstellung aus Satz von Dokumenten.

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(); 

Auch ich habe beobachtet, dass aus dem zweiten Such Iteration der Dateien im Index-Verzeichnis gelöscht zu werden und nur die Datei mit .segment Suffix wird immer Veränderungen wie .segmenta, .segmentb, .segmentc etc ..

Ich weiß nicht, warum diese seltsame Situation passiert.

+0

Können Sie meine Antwort überprüfen und sehen, ob es funktioniert? – coolk

Antwort

0

Ihr Code sieht ziemlich einfach aus. Ich habe also das Gefühl, dass Sie möglicherweise mit diesem Problem konfrontiert werden, weil etwas mit Ihren Indizes nicht in Ordnung ist. Die Informationen zur Erstellung von Indizes könnten bei der Diagnose hilfreich sein. Aber genauen Code dieses Mal :)

+0

Ich habe den Code aktualisiert. Bitte sehen Sie es sich an. – anand

0

Ich denke, Ihr Problem ist mit writer.deleteUnusedFiles() Anruf.

Gemäß JavaDocs kann dieser Aufruf "nicht referenzierte Index-Commits löschen".

Welche Indizes gelöscht werden sollen, wird von IndexDeletionPolicy gesteuert. Allerdings "Die Standardrichtlinie zum Löschen ist KeepOnlyLastCommitDeletionPolicy, die immer alte Commits löscht, sobald ein neues Commit durchgeführt wird (dies entspricht dem Verhalten vor 2.2)."

Es spricht auch über „löschen letzte schließen“, was bedeutet, wenn dieser Index verwendet wird und geschlossen (z. Während der Suche), wird dieser Index gelöscht werden.

So werden alle Indizes, die Ihrem ersten Suchergebnis entsprechen, sofort gelöscht.

Versuchen Sie folgendes:

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

Ich habe versucht, Ihr Schnipsel, aber es funktioniert immer noch nicht .. Es verhält sich immer noch auf die alte Art und Weise – anand

Verwandte Themen