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 убирает знаки препинания и пустые строки, собственно как и я.


Подскажите как быть в такой ситуации? Может есть какие-то мысли на этот счет? Буду благодарен любой стоящей идеи, заранее спасибо.


Ответы (0 шт):