2009-06-09 9 views
1

Sein Ershad hier. Ich arbeite an Lucene. Jetzt bin ich in der Lage, das Wort zu suchen. Aber wenn ich einen Teil des Wortes eintippe, kann ich die Ergebnisse nicht bekommen. Können Sie bitte vorschlagen, was zu tun ist.Wie suche ich nach einem Teil eines Wortes mit Lucene?

Für die Indizierung, ich bin mit dem folgenden Code

writer = new IndexWriter(directory, new StandardAnalyzer(), true); 
writer.SetUseCompoundFile(true); 

doc.Add(Field.UnStored("text", parseHtml(html))); 
doc.Add(Field.Keyword("path", relativePath)); 
writer.AddDocument(doc); 

für die Suche, ich den Code unten verwenden.

Query query = QueryParser.Parse(this.Query,"text",new StandardAnalyzer()); 

// create the result DataTable 
this.Results.Columns.Add("title", typeof(string)); 
this.Results.Columns.Add("sample", typeof(string)); 
this.Results.Columns.Add("path", typeof(string)); 

// search 
Hits hits = searcher.Search(query); 

this.total = hits.Length(); 

Antwort

6

Wenn Sie the Lucene Query Parser Syntax documentation beziehen, werden Sie feststellen, dass Sie einen Stern anfügen können (*) bis zum Ende der Abfrage all diese Worte zu entsprechen, die mit einer bestimmten Zeichenkette beginnen. Angenommen, Sie möchten Ergebnisse erhalten, die sowohl "Raupe" als auch "Katamaran" erwähnen. Ihre Suchanfrage wäre "cat *".

Wenn Sie jedoch nicht die direkte Kontrolle über die Suchabfrage haben (zum Beispiel wenn der Benutzer eigene Suchabfragen eingibt), dann benötigen Sie möglicherweise ein wenig Trickserei seitens der QueryParser. Meine Erfahrung ist ausschließlich mit der Java-Version von Lucene. Hoffentlich sind die Prinzipien mit Lucene.NET identisch. In Java können Sie die QueryParser Klasse erweitern und die newTermQuery(Term)-Methode überschreiben. Traditionell würde diese Methode ein Objekt TermQuery zurückgeben. Die untergeordnete Klasse würde jedoch stattdessen PrefixQuery zurückgeben. Zum Beispiel:

public class PrefixedTermsQueryParser extends QueryParser { 

    // Some constructors... 

    protected Query newTermQuery(Term term) { 
     return new PrefixQuery(term); 
    } 

} 

Ich bin nicht sehr sicher, welche Methoden Sie in Lucene.NET außer Kraft setzen können, aber ich bin sicher, dass es sein muss, etwas Ähnliches. Betrachtet man its documentation, scheint es the QueryParser class hat eine Methode namens GetFieldQuery. Vielleicht ist dies die Methode, die Sie überschreiben müssten.

+0

Hallo Adam, Danke für die Antwort. Danke für die Dokumentation links. Ich werde das versuchen und Ihnen antworten. –

+1

Die Dokumentationslinks sind beschädigt – irperez