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;
}
}
所以你寫了一個自定義分析器&那不按需要工作?你試過index的'version-number'的值是多少?你沒有顯示你的「文檔」結構,提供這個部分。 –
我已將FileDocument類添加到我的問題中。我在創建自定義之前嘗試過StandardAnalyzer。這非常簡單,我期望它將包含術語「version-string」的所有文檔編入索引作爲「內容」字段的一部分。 –
這也很有趣。當我搜索「物料清單」時,Lucene搜索不會產生任何結果(grepping會找到幾百個匹配項)。但是,當我搜索「刪除物料清單」時,Lucene和grep都找到相同數量的文件(大約10個)。這裏發生了什麼?我怎樣才能讓Lucene和grep搜索結果保持一致? –