Lucene не индексирует некоторые термины в документах

Я пытался использовать Lucene для индексации нашей базы данных кода. К сожалению, некоторые термины не включены в указатель. Например. в строке ниже я могу искать что угодно, кроме "номер версии":

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

Я попытался реализовать его как с 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));
    }
}

Наконец, класс 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;
    }
}

person n.jmurov    schedule 31.05.2017    source источник
comment
Итак, вы написали собственный анализатор, и он не работает должным образом? Какое значение version-number, которое вы пытались проиндексировать, - это одно длинное значение, о котором идет речь? Вы не показали свою Document структуру, предоставьте эту часть.   -  person Sabir Khan    schedule 31.05.2017
comment
Я добавил к своему вопросу класс FileDocument. Я пробовал StandardAnalyzer, прежде чем создавать собственный. Это очень просто, и я ожидаю, что он проиндексирует все документы, которые содержат термин строка-версия как часть поля содержимого.   -  person n.jmurov    schedule 02.06.2017
comment
Это тоже интересно. Когда я ищу спецификацию материалов, поиск Lucene не дает никаких результатов (grepping находит несколько сотен совпадений). Однако, когда я ищу удалить список материалов, и Lucene, и grep находят одинаковое количество файлов (около 10). Что тут происходит? Как сделать так, чтобы результаты поиска Lucene и grep совпадали?   -  person n.jmurov    schedule 13.06.2017


Ответы (1)


Думаю, я был идиотом. Я ограничивал количество совпадений до 500, а затем применял фильтры к найденным совпадениям. Ожидалось, что элементы будут извлечены в том порядке, в котором они были проиндексированы. Поэтому, когда я что-то искал в конце указателя, он говорил мне, что ничего не найдено. Фактически, он получит ожидаемые 500 элементов, но все они будут отфильтрованы.

person n.jmurov    schedule 15.06.2017