Кажется, что всякий раз, когда я обновляю существующий документ в индексе (такое же поведение для delete/add), его нельзя найти с помощью TermQuery. Вот короткий фрагмент:Lucene не может найти документы после обновления
iw = new IndexWriter (directory, config);
Document doc = new Document();
doc.add(new StringField("string", "a", Store.YES));
doc.add(new IntField("int", 1, Store.YES));
iw.addDocument(doc);
Query query = new TermQuery(new Term("string","a"));
Document[] hits = search(query);
doc = hits[0];
print(doc);
doc.removeField("int");
doc.add(new IntField("int", 2, Store.YES));
iw.updateDocument(new Term("string","a"), doc);
hits = search(query);
System.out.println(hits.length);
System.out.println("_________________");
for(Document hit : search(new MatchAllDocsQuery())){
print(hit);
}
Это производит следующий вывод на консоль:
stored,indexed,tokenized,omitNorms,indexOptions=DOCS_ONLY<string:a>
stored<int:1>
________________
0
_________________
stored,indexed,tokenized,omitNorms,indexOptions=DOCS_ONLY<string:a>
stored<int:2>
________________
Похоже, что после обновления, документ (а новый документ) в индексе и получает возвращаемый MatchAllDocsQuery, но не может можно найти в TermQuery.
Полный пример кода доступен на http://pastebin.com/sP2Vav9v
Кроме того, это происходит только (второй поиск не работает), если значение Стрингфилд содержит специальные символы (например, файл:/F: /).
Вы не пропустите 'iw.commit()'? – mindas
Ничего не меняет. Пробовал это aleady. Кроме того, поиск открывает новый читатель от автора каждый раз: DirectoryReader reader = DirectoryReader.open (iw, true); – Michael
Кажется, я сталкиваюсь с подобной проблемой. Какая версия Lucene это? – carlspring