当前位置: 首页 > news >正文

【lucene】FastVectorHighlighter案例

下面给出一套可直接拷贝运行的 Lucene 8.5.0 + FastVectorHighlighter 完整示例(JDK 8+),演示从建索引、查询到高亮的全过程。  

 

> 关键点:字段必须  

1. 存储原始内容(`setStored(true)`)  

2. 开启 TermVector(`setStoreTermVectors(true)` + `setStoreTermVectorPositions(true)` + `setStoreTermVectorOffsets(true)`)

 

---

 

1. Maven 依赖(Lucene 8.5.0)

 

```xml

<dependencies>

    <dependency>

        <groupId>org.apache.lucene</groupId>

        <artifactId>lucene-core</artifactId>

        <version>8.5.0</version>

    </dependency>

    <dependency>

        <groupId>org.apache.lucene</groupId>

        <artifactId>lucene-analyzers-common</artifactId>

        <version>8.5.0</version>

    </dependency>

    <dependency>

        <groupId>org.apache.lucene</groupId>

        <artifactId>lucene-highlighter</artifactId>

        <version>8.5.0</version>

    </dependency>

</dependencies>

```

 

---

 

2. Java 示例代码

 

```java

import org.apache.lucene.analysis.standard.StandardAnalyzer;

import org.apache.lucene.document.*;

import org.apache.lucene.index.*;

import org.apache.lucene.search.*;

import org.apache.lucene.store.ByteBuffersDirectory;

import org.apache.lucene.store.Directory;

import org.apache.lucene.search.highlight.*;

import org.apache.lucene.search.vectorhighlight.*;

 

public class FastVectorHighlighterDemo {

    public static void main(String[] args) throws Exception {

        Directory dir = new ByteBuffersDirectory();

        IndexWriterConfig cfg = new IndexWriterConfig(new StandardAnalyzer());

        IndexWriter writer = new IndexWriter(dir, cfg);

 

        // 1. 定义字段类型:存储 + 分词 + TermVector

        FieldType fieldType = new FieldType();

        fieldType.setStored(true); // 存储原文

        fieldType.setTokenized(true); // 分词

        fieldType.setStoreTermVectors(true); // 必须

        fieldType.setStoreTermVectorPositions(true); // 必须

        fieldType.setStoreTermVectorOffsets(true); // 必须

        fieldType.setIndexOptions(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS);

        fieldType.freeze();

 

        // 2. 添加文档

        Document doc = new Document();

        doc.add(new Field("title", "Lucene 8.5.0 FastVectorHighlighter示例", fieldType));

        doc.add(new Field("body",

                "Lucene是一个高效的全文检索库。FastVectorHighlighter利用TermVector实现高速高亮。", fieldType));

        writer.addDocument(doc);

        writer.commit();

        writer.close();

 

        // 3. 查询 & 高亮

        IndexReader reader = DirectoryReader.open(dir);

        IndexSearcher searcher = new IndexSearcher(reader);

 

        Query query = new BooleanQuery.Builder()

                .add(new TermQuery(new Term("body", "全文检索")), BooleanClause.Occur.SHOULD)

                .add(new TermQuery(new Term("body", "高亮")), BooleanClause.Occur.SHOULD)

                .build();

 

        TopDocs topDocs = searcher.search(query, 10);

        int docId = topDocs.scoreDocs[0].doc;

 

        // 4. 使用 FastVectorHighlighter

        FastVectorHighlighter highlighter = new FastVectorHighlighter(true, true,

                new SimpleFragListBuilder(5),

                new ScoreOrderFragmentsBuilder(

                        BaseFragmentsBuilder.COLORED_PRE_TAGS,

                        BaseFragmentsBuilder.COLORED_POST_TAGS));

 

        FieldQuery fieldQuery = highlighter.getFieldQuery(query);

        String[] frags = highlighter.getBestFragments(fieldQuery, reader, docId,

                "body", 100, 3);

 

        // 5. 输出结果

        System.out.println("Title: " + reader.document(docId).get("title"));

        for (String f : frags) {

            System.out.println("Fragment: " + f);

        }

 

        reader.close();

    }

}

```

 

---

 

3. 运行结果(示例)

 

```

Title: Lucene 8.5.0 FastVectorHighlighter示例

Fragment: Lucene是一个高效的<b style="background:yellow">全文检索</b>库。FastVectorHighlighter利用TermVector实现高速<b style="background:lawngreen">高亮</b>。

```

 

---

 

4. 常见坑提醒

 

问题 原因 

高亮返回 `null` 字段没开启 TermVector,或没 `setStored(true)` 

MultiPhraseQuery / SpanQuery 无法高亮 FastVectorHighlighter 不支持,需换 UnifiedHighlighter 的 re-analysis 模式 

 

---

 

直接复制到 IDE 即可运行,祝编码愉快!

http://www.lryc.cn/news/607488.html

相关文章:

  • 基于线性规划的储能充放电仿真系统
  • Android Frameworks从零开始
  • JSON 对象在浏览器中顺序与后端接口返回不一致的问题
  • 好未来披露2026财年Q1财报:净利润3128万美元,同比大增174%
  • Day 28:类的定义和方法
  • Git 命令使用指南:从入门到进阶
  • MySQL CPU占用过高排查指南
  • 数据处理四件套:NumPy/Pandas/Matplotlib/Seaborn速通指南
  • Agents-SDK智能体开发[3]之多Agent执行流程
  • SN74LVC1G08DBVR 德州仪器(TI)逻辑芯片IC 电源芯片 ESD保护
  • 智慧社区构建——2
  • C语言(02)——标准库函数大全(持续更新)
  • AI Agent 视角:可执行程序的二进制格式,是一场「结构化语言」与「智能解析」的双向奔赴
  • 一套视频快速入门并精通PostgreSQL
  • 03 Broker主从架构和集群模式
  • (二)LoRA微调BERT:为何在单分类任务中表现优异,而在多分类任务中效果不佳?
  • Hutool 的完整 JSON 工具类示例
  • 使用社区 EE 镜像运行 Ansible
  • Redis的ZipList、SkipList和ListPack之间的区别
  • 在Alpine Linux上配置Redis使用NFS存储的完整指南
  • 李宏毅深度学习教程 第4-5章 CNN卷积神经网络+RNN循环神经网络
  • 每天一点跑步运动小知识
  • 逻辑回归算法 银行贷款资格判断案例,介绍混淆矩阵与正则化惩罚
  • AG-UI 协议全面解析--下一代 AI Agent 交互框架医疗应用分析(下)
  • Python 项目路径配置完全指南
  • 51单片机入门:模块化编程
  • C#常见的转义字符
  • 智能Agent场景实战指南 Day 29:Agent市场趋势与前沿技术
  • 31. 伪类和伪元素区别
  • 板卡型授时设备的优势总结.北斗pcie对时装置,北斗双模pcie授时板卡,双模pcie授时板卡