Lucene: выдает позицию слова, которой нет, как быть?
У меня есть текст, который храниться в переменной fileContent:
Book0 Book1 \r\n\r\n\r\n NATO2
Bar
Book4 Book
WEAPONRY
Book6 Terrorist
Я считываю fileContent своим методом, в котором убираю знаки препинания и удаляю пустые строки, и создаю из этих слов объекты класса TextWord, при этом не изменяя fileContent.
После этого я получаю такой массив из объектов TextWord:
Original TextWord[0]: Book0
Original TextWord[1]: Book1
Original TextWord[2]: r\n\r\n\r\n
Original TextWord[3]: NATO2
Original TextWord[4]: Bar
Original TextWord[5]: Book4
Original TextWord[6]: Book
Original TextWord[7]: WEAPONRY
Book6
Original TextWord[8]: Terrorist
Дальше я строю индекс по переменной fileContent. Дальше ищу слово "WEAPONRY" в этом тексте с помощью Lucene. Он говорит, что есть такое слово, выдает позицию 12.
Position: 12, startOffset: 62 length: 8 Freg: 1
Я обращаюсь к своему тексту (к массиву этих TextWord) и хочу получить это слово из позиции 12, но выдается ошибка, что по такой позиции нет слова или вовсе нет такой позиции.
Мой код получения позиции:
String query_pattern = rword.getOneWord(); //Что хочу найти в тексте
DirectoryReader reader = DirectoryReader.open(this.memoryIndex); //Взять индекс из памяти
IndexSearcher searcher = new IndexSearcher(reader); //Создать поисковик по индексу
//Поиск по одному слову
Query query = new QueryParser("tags", analyzer).parse(query_pattern.toLowerCase()); //Запрос на поиск слова по полю tags
TopDocs results = searcher.search(query, 1); //Результат поиска
for (ScoreDoc scoreDoc : results.scoreDocs) { //Если слово было найдено, то...
Fields termVs = reader.getTermVectors(scoreDoc.doc);
Terms f = termVs.terms("tags");
BytesRef ref = new BytesRef(query_pattern.toLowerCase()); //Шаблон в байтах для проверки
TermsEnum te = f.iterator();
PostingsEnum docsAndPosEnum = null;
if (te.seekExact(ref)) { //Если нашли такое слово из шалона, то...
//Узнать позицию и число повторений этого слова
docsAndPosEnum = te.postings(docsAndPosEnum, PostingsEnum.ALL);
int nextDoc = docsAndPosEnum.nextDoc();
assert nextDoc != DocIdSetIterator.NO_MORE_DOCS;
final int freg = docsAndPosEnum.freq();
final int pos = docsAndPosEnum.nextPosition();
final int o = docsAndPosEnum.startOffset();
System.out.println(" ");
System.out.println("Word: " + ref.utf8ToString());
System.out.println("[1] of ["+freg+"] Position: " + pos + ", startOffset: " + o + " length: " + ref.length + " Freg: " + freg);
Подскажите, может Lucene при индексации как-то обрабатывает исходный текст, что он потом изменяется? Я знаю, что эта библиотека Lucene убирает знаки препинания и пустые строки, собственно как и я.
Подскажите как быть в такой ситуации? Может есть какие-то мысли на этот счет? Буду благодарен любой стоящей идеи, заранее спасибо.