2014-01-08 4 views
0

У меня есть следующий код, используя Lucene.NET V4, чтобы проверить, существует ли файл в моем индексе.Lucene.NET - проверка наличия документа в индексе

bool exists = false; 
IndexReader reader = IndexReader.Open(Lucene.Net.Store.FSDirectory.Open(lucenePath), false); 
Term term = new Term("filepath", "\\myFile.PDF"); 
TermDocs docs = reader.TermDocs(term); 
if (docs.Next()) 
{ 
    exists = true; 
} 

Файл myFile.PDF определенно существует, но она всегда возвращается как false. Когда я смотрю на docs в отладке, его Doc и Freq свойства утверждают, что они «бросили исключение типа" System.NullReferenceException.

ответ

0

Прежде всего, это хорошая практика, чтобы использовать один и тот же экземпляр IndexReader если вы «Не собираюсь рассматривать удаленные документы - он будет работать лучше, и он потокобезопасен, поэтому вы можете сделать из него статическое поле только для чтения (хотя, я вижу, что вы указываете false для параметра readOnly, поэтому в случае это необходимо, просто проигнорируйте этот абзац).

Что касается вашего случая, вы указали значения filepath? Потому что, если вы (например, используя StandardAnalyzer при индексировании/поиске), у вас, вероятно, возникнут проблемы с поиском таких значений, как \myFile.PDF (с использованием токенизатора по умолчанию, значение будет разделено на myFile и PDF, не уверенно о ведущей обратной косой чертой).

Надеюсь, это поможет.

0

Возможно, вы проанализировали поле «путь к файлу» при индексировании с помощью анализатора, который токенизирует/изменяет содержимое. например StandardAnalyzer токенизирует, помещает в нижние регионы, удаляет стоп-слова, если они указаны и т. д.

Если вам нужно запросить только точный путь к файлу, как в вашем примере, используйте KeywordAnalyzer во время индексации для этого поля.

Если вы не можете повторно проиндексировать в данный момент, вам нужно выяснить, какой анализатор используется во время индексирования и использовать его для создания запроса. У вас есть два варианта:

  1. Использовать анализатор запросов с помощью анализатора и проанализировать запрос filepath:\\myFile.PDF. Если результирующий запрос является TermQuery, вы можете использовать его термин, как и в своем примере. В противном случае выполните поиск с запросом.
  2. Используйте анализатор непосредственно для создания условий из объекта TokenStream. Опять же, если только один термин, сделайте это так же, как и вы, если условия multipe, создайте запрос фразы.
Смежные вопросы