Lucene查询结果高亮

简介: 检索结果高亮对于用户的体验度和友好度非常重要,可以快速标记出用户检索对关键词。本例中的索引仍使用上一篇博客( Lucene查询索引)中创建的索引,代码高亮参考了Lucene4.x高亮 fast高亮 前端高亮。

检索结果高亮对于用户的体验度和友好度非常重要,可以快速标记出用户检索对关键词。本例中的索引仍使用上一篇博客( Lucene查询索引)中创建的索引,代码高亮参考了Lucene4.x高亮 fast高亮 前端高亮

实现效果:

这里写图片描述

核心代码

package ucas.ir.lucene;

import java.io.File;
import java.io.IOException;

import javax.print.Doc;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.core.KeywordAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.highlight.Fragmenter;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.apache.lucene.search.highlight.SimpleSpanFragmenter;
import org.apache.lucene.search.highlight.TokenSources;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;

public class IndexSearch {

    public static void main(String[] args) {
        Directory directory = null;
        try {
            File indexpath = new File("/Users/yp/Documents/workspace/UCASIR/WebContent/index");
            if (indexpath.exists() != true) {
                indexpath.mkdirs();
            }
            // 设置要查询的索引目录
            directory = FSDirectory.open(indexpath);
            // 创建indexSearcher
            DirectoryReader dReader = DirectoryReader.open(directory);
            IndexSearcher searcher = new IndexSearcher(dReader);
            // 设置分词方式
            Analyzer analyze2 = new StandardAnalyzer(Version.LUCENE_43);// 标准分词
            Analyzer analyzer = new IKAnalyzer();

            // 设置查询域
            String field="news_title";
            QueryParser parser = new QueryParser(Version.LUCENE_43, field, analyzer);
            // 查询字符串
            Query query = parser.parse("阿法狗");

            QueryScorer scorer=new QueryScorer(query,field);
            SimpleHTMLFormatter fors=new SimpleHTMLFormatter("<span style=\"color:red;\">", "</span>");
            Highlighter highlighter=new Highlighter(fors, scorer);

            System.out.println("query:" + query.toString());
            // 返回前10条
            TopDocs topDocs = searcher.search(query, 10);
            if (topDocs != null) {
                System.out.println("符合条件第文档总数:" + topDocs.totalHits);

                for (int i = 0; i < topDocs.scoreDocs.length; i++) {
                    Document doc = searcher.doc(topDocs.scoreDocs[i].doc);
                    TokenStream tokenStream=TokenSources.getAnyTokenStream(searcher.getIndexReader(), topDocs.scoreDocs[i].doc, field, analyzer);
                    Fragmenter  fragment=new SimpleSpanFragmenter(scorer);
                    highlighter.setTextFragmenter(fragment); 
                    //高亮news_title域
                    String str=highlighter.getBestFragment(tokenStream, doc.get("news_title"));//获取高亮的片段,可以对其数量进行限制  
                    System.out.println("高亮title:"+str);
                    tokenStream=TokenSources.getAnyTokenStream(searcher.getIndexReader(), topDocs.scoreDocs[i].doc, "news_summary", analyzer);
                    str=highlighter.getBestFragment(tokenStream, doc.get("news_summary"));//获取高亮的片段,可以对其数量进行限制  
                    System.out.println("高亮summary:"+str);
                }
            }
            directory.close();
            dReader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

结果:
这里写图片描述

目录
相关文章
|
Python
python使用pip镜像源加速安装包(清华、阿里、中科大)
python使用pip镜像源加速安装包(清华、阿里、中科大)
8324 0
python使用pip镜像源加速安装包(清华、阿里、中科大)
|
安全 编译器 C语言
深入分析宏定义的优势、局限性及最佳实践。
深入分析宏定义的优势、局限性及最佳实践。
|
弹性计算 固态存储 数据可视化
2023阿里云ECS服务器配置价格表_租用费用
2023阿里云ECS服务器配置价格表_租用费用,轻量应用服务器和云服务器ECS优惠价格表,阿里云轻量应用服务器2核2G3M带宽轻量服务器一年108元,2核4G4M带宽轻量服务器一年297.98元12个月,云服务器ECS包括通用算力型u1、ECS计算型c7、通用型g7和内存型r7均有活动
342 0
|
10月前
|
负载均衡 监控 网络协议
OSPF中的度量值(Metric)设置:原理与应用
OSPF中的度量值(Metric)设置:原理与应用
1091 2
|
机器学习/深度学习 安全 算法框架/工具
开源vs闭源,大模型的未来在哪一边?
开源vs闭源,大模型的未来在哪一边?
468 0
开源vs闭源,大模型的未来在哪一边?
|
Linux Python Windows
Linux 系统中 挂载 U 盘 方法
在 Linux 系统中,与 Windows 不一样的是,无法自动识别加载外部设备例如 U 盘、硬盘;例如用 PyCharm 或 IDEA 打开 U 盘中的内容,在没有完成挂载操作之前是不可行的 如果想实现上面操作,第一步,需要对 U 盘等外接移动设备完成 挂载操作
Linux 系统中 挂载 U 盘 方法
|
Web App开发 Java Apache
java.lang.NumberFormatException: For input string: &quot;undefined&quot;
在将字符串转换为数字时导致此错误,解决此问题的思路:1、添加Try catch语句,2、判断字符串是否为数字,将介绍java中判断字符串是否为数字的方法的几种方法。 完整错误信息: java.
2339 0
Redis内存满了怎么办?让你玩懂8种内存淘汰策略
我们知道redis是一个非常常用的内存型数据库,数据从内存中读取是它非常高效的原因之一,那么但是如果有一天, 「 redis分配的内存满了怎么办 」 ?遇到这个面试题不要慌,这种问题我们分为两角度回答就可以:
|
机器学习/深度学习 人工智能 并行计算
算力中国年度突破成果出炉,PAI灵骏智算上榜!
近日,由工业和信息化部、宁夏回族自治区人民政府共同举办的2023中国算力大会在银川举行。会上公布了算力领域最具影响力专家学者共同评选出的算力中国·年度突破成果,阿里云“PAI灵骏智算服务”作为国内AI智算基础设施代表获得该重磅奖项。
|
机器学习/深度学习 传感器 算法
【倒立摆】基于PID模糊控制算法模拟倒立摆系统附Matlab代码
【倒立摆】基于PID模糊控制算法模拟倒立摆系统附Matlab代码