Lucene不为文档中的某些术语编制索引

Lucene不为文档中的某些术语编制索引,lucene,lucene.net,pylucene,Lucene,Lucene.net,Pylucene,我一直在尝试使用Lucene为我们的代码数据库编制索引。不幸的是,索引中遗漏了一些术语。例如,在下面的字符串中,我可以搜索除“版本号”以外的任何内容: 我尝试用Lucene.NET 3.1和pylucene 6.2.0实现它,结果是一样的 以下是我在Lucene.NET中实现的一些详细信息: using (var writer = new IndexWriter(FSDirectory.Open(INDEX_DIR), new CustomAnalyzer(), true, IndexWrite

我一直在尝试使用Lucene为我们的代码数据库编制索引。不幸的是,索引中遗漏了一些术语。例如,在下面的字符串中,我可以搜索除“版本号”以外的任何内容:

我尝试用Lucene.NET 3.1和pylucene 6.2.0实现它,结果是一样的

以下是我在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));
    }
}
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 == '-' ;
    }
}
最后,CustomTokenizer类:

public sealed class CustomAnalyzer : Analyzer
{
    public override TokenStream TokenStream(System.String fieldName, System.IO.TextReader reader)
    {
        return new LowerCaseFilter(new CustomTokenizer(reader));
    }
}
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;
    }
}

我想我是个白痴。我将点击次数限制在500次,然后对找到的点击应用过滤器。这些项目应按照索引顺序检索。因此,当我在索引末尾查找某个内容时,它会告诉我什么也没有找到。事实上,它将检索到预期的500个项目,但它们都已被过滤掉。

那么您编写了一个自定义分析器&它没有按预期工作?您尝试索引的
版本号
的值是多少,问题中显示的一个长值?您尚未显示您的
文档
结构,请提供该部分。我已将FileDocument类添加到我的问题中。在创建自定义分析器之前,我尝试了StandardAnalyzer。它非常简单,我希望它将包含术语“version string”的所有文档作为“contents”字段的一部分进行索引。当我搜索“材料清单”时,Lucene搜索不会产生任何结果(grepping会找到几百个匹配项)。然而,当我搜索“删除物料清单”时,Lucene和grep都会找到相同数量的文件(大约10个)。这是怎么回事?如何使Lucene和grep的搜索结果相同?