(Java) ошибка при выделении слова в Lucene

пытаюсь выделить найденные слова тегами. Программа работает до строчки:

TextFragment[] frag = highlighter.getBestTextFragments(tokenStream, text, false, 1);

и выдает такой сообщение:

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.lucene.index.FieldInfo.<init>(Ljava/lang/String;IZZZLorg/apache/lucene/index/IndexOptions;Lorg/apache/lucene/index/DocValuesType;JLjava/util/Map;II)V
    at org.apache.lucene.index.memory.MemoryIndex.createFieldInfo(MemoryIndex.java:503)
    at org.apache.lucene.index.memory.MemoryIndex.getInfo(MemoryIndex.java:486)
    at org.apache.lucene.index.memory.MemoryIndex.addField(MemoryIndex.java:473)
    at org.apache.lucene.index.memory.MemoryIndex.addField(MemoryIndex.java:452)
    at org.apache.lucene.index.memory.MemoryIndex.addField(MemoryIndex.java:431)
    at org.apache.lucene.search.highlight.WeightedSpanTermExtractor.getLeafContext(WeightedSpanTermExtractor.java:402)
    at org.apache.lucene.search.highlight.WeightedSpanTermExtractor.extractWeightedTerms(WeightedSpanTermExtractor.java:361)
    at org.apache.lucene.search.highlight.WeightedSpanTermExtractor.extract(WeightedSpanTermExtractor.java:140)
    at org.apache.lucene.search.highlight.WeightedSpanTermExtractor.extract(WeightedSpanTermExtractor.java:111)
    at org.apache.lucene.search.highlight.WeightedSpanTermExtractor.getWeightedSpanTerms(WeightedSpanTermExtractor.java:510)
    at org.apache.lucene.search.highlight.QueryScorer.initExtractor(QueryScorer.java:218)
    at org.apache.lucene.search.highlight.QueryScorer.init(QueryScorer.java:186)
    at org.apache.lucene.search.highlight.Highlighter.getBestTextFragments(Highlighter.java:201)
    at com.mycompany.example.HighLightTest.myTest(HighLightTest.java:96)
    at com.mycompany.example.Test.main(Test.java:87)

Весь код программы:

        FieldType type = new FieldType();
        type.setIndexOptions(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS);
        type.setStored(true);
        type.setStoreTermVectors(true);
        type.setTokenized(true);
        type.setStoreTermVectorOffsets(true);

        Field field = new Field("title",  "How to read UTF8 text file into String in Java", type); //term vector enabled
        Field f = new TextField("content", "How to read UTF8 text file into String in Java", Field.Store.YES);
        
        Document doc1 = new Document(); 
        doc1.add(field);
        doc1.add(f);
        
        Query query = new QueryParser("title", analyzer).parse("read file string utf8");
        String outputDir = "E:\\Projects\\Data\\rubrics\\luceneResult";
        
        Directory directory = FSDirectory.open(Paths.get(outputDir));
        IndexWriterConfig config = new IndexWriterConfig(analyzer);
        config.setOpenMode(IndexWriterConfig.OpenMode.CREATE);
        
        IndexWriter indexWriter = new IndexWriter(directory, config);
        indexWriter.addDocument(doc1);
        indexWriter.close();
        
        
        IndexReader reader = DirectoryReader.open(directory);
        IndexSearcher indexSearcher = new IndexSearcher(reader);
        TopDocs topDocs = indexSearcher.search(query, 100);

        // Используем подсветку только при наличии совпадающих документов
        if (topDocs.totalHits > 0) {

            // По умолчанию используется подсветка <B> </ B>
            // SimpleHTMLFormatter htmlFormatter = new SimpleHTMLFormatter();
            // Выборочная подсветка
            SimpleHTMLFormatter htmlFormatter = new SimpleHTMLFormatter("<strong>", "</strong>");
            Highlighter highlighter = new Highlighter(htmlFormatter, new QueryScorer(query));
            for (int i = 0; i < 10; i++) {
                int id = topDocs.scoreDocs[i].doc;
                Document doc = indexSearcher.doc(id);
                String text = doc.get("content");
                TokenStream tokenStream = TokenSources.getAnyTokenStream(indexSearcher.getIndexReader(), id, "content", analyzer);

                TextFragment[] frag = highlighter.getBestTextFragments(tokenStream, text, false, 1);// highlighter.getBestFragments(tokenStream,
                // text,
                // 3,
                // "...");
                for (int j = 0; j < frag.length; j++) {
                    if ((frag[j] != null) && (frag[j].getScore() > 0)) {
                        System.out.println((frag[j].toString()));
                    }
                }
                // Term vector
                text = doc.get("name");
                tokenStream = TokenSources.getAnyTokenStream(indexSearcher.getIndexReader(), topDocs.scoreDocs[i].doc, "name",
                        analyzer);
                frag = highlighter.getBestTextFragments(tokenStream, text, false, 10);
                for (int j = 0; j < frag.length; j++) {
                    if ((frag[j] != null) && (frag[j].getScore() > 0)) {
                        System.out.println((frag[j].toString()));
                    }
                }
                System.out.println("-------------");
            }

        }
    }

Подскажите как быть, что я делаю не так? Не очень хорошо знаком с Lucene, поэтому буду рад любой помощь, заранее спасибо.


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