2016-06-10 19 views
0

Ich habe einen unteren Datenindex in Lucene 4.8 und Code.Lucene Suchergebnis

Finance expense 
Admin expenses 
Transaction expense 
Salary expenses 

Indizierung:

try { 
    writer = createWriter(ramDirectory); 
    for(String line : readFile(FILE_PATH)) { 
     String[] split = line.split(","); 
     Document doc = new Document(); 
     doc.add(new TextField("id", split[0].trim(), Field.Store.YES)); 
     doc.add(new TextField("name", split[1].trim(), Field.Store.YES));          
     writer.addDocument(doc);     
    } 
    writer.commit();    
} finally { 
    if(writer != null) { 
     writer.close(); 
    } 
} 

Suche

IndexSearcher searcher = new IndexSearcher(DirectoryReader.open(ramDirectory)); 
QueryParser nameQParser = new QueryParser(Version.LUCENE_48, "name", new StandardAnalyzer(Version.LUCENE_48)); 
Query query = nameQParser.parse("expense"); 
TopDocs queryResults = searcher.search(query, 10); 

Above Code Rückkehr nur unter zwei Ergebnissen. Es gibt kein Ergebnis zurück, das am Ende "drin" ist.

Aktuelles Ergebnis:

Finance expense 
Transaction expense 

Erwartete Ergebnisse:

Finance expense 
Admin expenses 
Transaction expense 
Salary expenses 

Bitte legen nahe, was in meinem Code falsch ist.

Antwort

0

Sie WildCardQuery verwenden könnte, weil das Wort expense in allen vier Dokument enthält, so dass Sie Suchbegriff als *expense* passieren denen alle Dokumente mit Ausgaben in name Feld zurückgeben.

Vergessen Sie nicht, QueryParser einzurichten führenden Platzhalter zu ermöglichen, mit dem folgenden:

QueryParser.setAllowLeadingWildcard(true) 

Änderungen an Ihrem folgenden Code:

nameQParser.setAllowLeadingWildcard(true); 
Query query = nameQParser.parse("*expense*"); 
0

Im Allgemeinen ist der beste Weg, mit Pluralformen umzugehen, ein Analysator zu verwenden, der sie besser handhabt. enthält einen Stemmer, der das handhaben sollte. Es würde sowohl den "Aufwand" als auch den "Aufwand" (und den "Aufwand" und den "Aufwand") auf den Stamm "Expens" im Index reduzieren.

Anternately, etwas clunkier, aber man konnte nur ein Präfix Abfrage in diesem Fall verwenden: Query query = nameQParser.parse("expense*");