2017-05-31 73 views
0

我一直在嘗試使用Lucene來索引我們的代碼數據庫。不幸的是,索引中有些術語被忽略。例如。在下面的字符串,我可以比「版本號」以外的任何搜索:Lucene不索引文件中的一些術語

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

我試圖與這兩個Lucene.NET 3.1和6.2.0 pylucene實現它,具有相同的結果。

下面是我實現的一些細節在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(); 
} 

的CustomAnalyzer類:

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

最後,CustomTokenizer類:

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 == '-' ; 
    } 
} 

它看起來像「版本號」和其他一些術語沒有被索引,因爲它們存在於99%的版本中文檔。它能成爲問題的原因嗎?

編輯:按照要求,FileDocument類:

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

所以你寫了一個自定義分析器&那不按需要工作?你試過index的'version-number'的值是多少?你沒有顯示你的「文檔」結構,提供這個部分。 –

+0

我已將FileDocument類添加到我的問題中。我在創建自定義之前嘗試過StandardAnalyzer。這非常簡單,我期望它將包含術語「version-string」的所有文檔編入索引作爲「內容」字段的一部分。 –

+0

這也很有趣。當我搜索「物料清單」時,Lucene搜索不會產生任何結果(grepping會找到幾百個匹配項)。但是,當我搜索「刪除物料清單」時,Lucene和grep都找到相同數量的文件(大約10個)。這裏發生了什麼?我怎樣才能讓Lucene和grep搜索結果保持一致? –

回答

0

我覺得我是一個傻瓜。我將點擊次數限制爲500,然後在找到的匹配上應用濾鏡。預計這些項目將按照它們編入索引的順序進行檢索。所以當我在索引末尾尋找某些東西時,它會告訴我沒有發現任何東西。事實上,它將檢索預期的500個項目,但它們全都被過濾掉了。