2017-05-31 6 views
0

Ich habe versucht, Lucene zu verwenden, um unsere Codedatenbank zu indizieren. Leider werden einige Begriffe aus dem Index weggelassen. Z.B. in der folgenden Zeichenkette, ich auf etwas anderes als „Versionsnummer“ suchen:Lucene indexiert einige Begriffe in Dokumenten nicht

version-number "cAELimpts.spl SCOPE-PAY:10.1.10 25nov2013kw101730 Setup EMployee field if missing" 

habe ich versucht, es mit beiden Lucene.NET 3.1 und PyLucene 6.2.0, mit dem gleichen Ergebnis zu implementieren.

Hier sind einige Details meiner Implementierung in Lucene.NET:

using (var writer = new IndexWriter(FSDirectory.Open(INDEX_DIR), new CustomAnalyzer(), true, IndexWriter.MaxFieldLength.UNLIMITED)) 
{ 
    Console.Out.WriteLine("Indexing to directory '" + INDEX_DIR + "'..."); 
    IndexDirectory(writer, docDir); 
    Console.Out.WriteLine("Optimizing..."); 
    writer.Optimize(); 
    writer.Commit(); 
} 

Die CustomAnalyzer Klasse:

public sealed class CustomAnalyzer : Analyzer 
{ 
    public override TokenStream TokenStream(System.String fieldName, System.IO.TextReader reader) 
    { 
     return new LowerCaseFilter(new CustomTokenizer(reader)); 
    } 
} 

Schließlich ist die CustomTokenizer Klasse:

public class CustomTokenizer : CharTokenizer 
{ 
    public CustomTokenizer(TextReader input) : base(input) 
    { 
    } 

    public CustomTokenizer(AttributeFactory factory, TextReader input) : base(factory, input) 
    { 
    } 

    public CustomTokenizer(AttributeSource source, TextReader input) : base(source, input) 
    { 
    } 

    protected override bool IsTokenChar(char c) 
    { 
     return System.Char.IsLetterOrDigit(c) || c == '_' || c == '-' ; 
    } 
} 

Es sieht aus wie "Versionsnummer" und einige andere Begriffe werden nicht indiziert, da sie in 99% der Fälle vorhanden sind Unterlagen. Kann es die Ursache des Problems sein?

EDIT: Wie gewünscht, die FileDocument Klasse:

public static class FileDocument 
{ 
    public static Document Document(FileInfo f) 
    { 

     // make a new, empty document 
     Document doc = new Document(); 

     doc.Add(new Field("path", f.FullName, Field.Store.YES, Field.Index.NOT_ANALYZED)); 
     doc.Add(new Field("modified", DateTools.TimeToString(f.LastWriteTime.Millisecond, DateTools.Resolution.MINUTE), Field.Store.YES, Field.Index.NOT_ANALYZED)); 
     doc.Add(new Field("contents", new StreamReader(f.FullName, System.Text.Encoding.Default))); 

     // return the document 
     return doc; 
    } 
} 
+0

Sie haben also einen benutzerdefinierten Analysator geschrieben, der nicht wie gewünscht funktioniert? Was ist der Wert von 'Versionsnummer', den Sie versucht haben, Index, der eine lange Wert in Frage? Sie haben Ihre "Dokument" -Struktur nicht angezeigt, stellen Sie diesen Teil zur Verfügung. –

+0

Ich habe die FileDocument-Klasse zu meiner Frage hinzugefügt. Ich habe StandardAnalyzer ausprobiert, bevor ich das benutzerdefinierte erstellt habe. Es ist sehr einfach und ich würde erwarten, dass es alle Dokumente indexiert, die den Begriff "version-string" als Teil des Feldes "contents" enthalten. –

+0

Das ist auch interessant. Wenn ich nach "Bill-of-Materials" suche, liefert die Lucene-Suche keine Ergebnisse (grepping findet einige hundert Treffer). Wenn ich jedoch nach "Stückliste löschen" suche, finden sowohl Lucene als auch grep die gleiche Anzahl von Dateien (etwa 10). Was ist denn hier los? Wie kann ich die Suchergebnisse in Lucene und Grep identisch machen? –

Antwort

0

Ich glaube, ich war ein Idiot zu sein. Ich beschränkte die Anzahl der Treffer auf 500 und wandte dann Filter auf die gefundenen Treffer an. Es wurde erwartet, dass die Artikel in der Reihenfolge abgerufen werden, in der sie indiziert wurden. Als ich am Ende des Index nach etwas suchte, würde es mir sagen, dass nichts gefunden wurde. In der Tat würde es die erwarteten 500 Elemente abrufen, aber sie wären alle herausgefiltert worden.

Verwandte Themen