Lucene多字段查询高亮显示

2023-10-12 03:18

本文主要是介绍Lucene多字段查询高亮显示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 在百度搜索的时候,查询的关键词会高亮显示
  • 在搜索一个关键词的时候,有可能这个关键词在title和content中,搜索的时候要把结果全部显示出来

实例说明

package com.bart.lucene.mutilseacher;import java.util.ArrayList;
import java.util.List;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.highlight.Formatter;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.Scorer;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.junit.Test;
import com.bart.lucene.entity.Article;
import com.bart.lucene.util.LuceneUtils;/*** Article多条件搜索加高亮显示* @author hp*/
public class ArticleDao {/*** 高亮显示* 查询索引库中所有的记录* @throws Exception */@Testpublic void findAll() throws Exception{String keyword = "显卡";List<Article>articleList = new ArrayList<Article>(); IndexSearcher indexSearcher = new  IndexSearcher(LuceneUtils.getDirectory());//默认之搜索一个字段,单条件搜索//QueryParser queryParser = new QueryParser(LuceneUtils.getVersion(),"content",LuceneUtils.getAnalyzer());//搜索多个字段,多条件搜索QueryParser queryParser2 = new MultiFieldQueryParser(LuceneUtils.getVersion(),new String[]{"title","content"},LuceneUtils.getAnalyzer());//Query query = queryParser.parse(keyword);Query query = queryParser2.parse(keyword);TopDocs topDocs = indexSearcher.search(query,100);//以下代码对查询结果进行高亮显示// 1.格式化对象,设置前缀和后缀Formatter formatter = new SimpleHTMLFormatter("<font color='red'>","</font>");// 2.关键词对象Scorer scorer = new QueryScorer(query);// 3. 高亮对象Highlighter highlighter = new Highlighter(formatter, scorer);for(int i=0;i<topDocs.scoreDocs.length;i++){ScoreDoc scoreDoc = topDocs.scoreDocs[i];int no = scoreDoc.doc;//关键词没有高亮Document document = indexSearcher.doc(no);// 1. 关键词添加高亮String titleHighLight  = highlighter.getBestFragment(LuceneUtils.getAnalyzer(),"title",document.get("title"));String contentHighLight  = highlighter.getBestFragment(LuceneUtils.getAnalyzer(),"content",document.get("content"));// 2. 将高亮的结果再次封装到document对象中document.getField("title").setValue(titleHighLight);document.getField("content").setValue(contentHighLight);Article article = LuceneUtils.document2JavaBean(document,Article.class);articleList.add(article);}//遍历for(Article a : articleList){System.out.println(a);}}/*** 增加document对象到对象索引库中* @throws Exception*/@Testpublic void testCreate() throws Exception{Article article = new Article(1,"显卡","显卡是电脑的核心部件",10);Document document = LuceneUtils.javaBean2Document(article);IndexWriter indexWriter = new IndexWriter(LuceneUtils.getDirectory(), LuceneUtils.getAnalyzer(), LuceneUtils.getMaxFieldLength());indexWriter.addDocument(document);//设置当插入三条记录的时候合并到同一条记录,默认是10个缓存就合并索引的cfs文件indexWriter.setMergeFactor(3);
//        //合并记录,不管插入多少条
//        indexWriter.optimize();indexWriter.close();}}

输出结果:
Article [id=1, title=, content=是电脑的核心部件, count=10]

这篇关于Lucene多字段查询高亮显示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/192861

相关文章

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

MySQL不使用子查询的原因及优化案例

《MySQL不使用子查询的原因及优化案例》对于mysql,不推荐使用子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,本文给大家... 目录不推荐使用子查询和JOIN的原因解决方案优化案例案例1:查询所有有库存的商品信息案例2:使用EX

SpringBoot基于MyBatis-Plus实现Lambda Query查询的示例代码

《SpringBoot基于MyBatis-Plus实现LambdaQuery查询的示例代码》MyBatis-Plus是MyBatis的增强工具,简化了数据库操作,并提高了开发效率,它提供了多种查询方... 目录引言基础环境配置依赖配置(Maven)application.yml 配置表结构设计demo_st

电脑显示hdmi无信号怎么办? 电脑显示器无信号的终极解决指南

《电脑显示hdmi无信号怎么办?电脑显示器无信号的终极解决指南》HDMI无信号的问题却让人头疼不已,遇到这种情况该怎么办?针对这种情况,我们可以采取一系列步骤来逐一排查并解决问题,以下是详细的方法... 无论你是试图为笔记本电脑设置多个显示器还是使用外部显示器,都可能会弹出“无HDMI信号”错误。此消息可能

Redis KEYS查询大批量数据替代方案

《RedisKEYS查询大批量数据替代方案》在使用Redis时,KEYS命令虽然简单直接,但其全表扫描的特性在处理大规模数据时会导致性能问题,甚至可能阻塞Redis服务,本文将介绍SCAN命令、有序... 目录前言KEYS命令问题背景替代方案1.使用 SCAN 命令2. 使用有序集合(Sorted Set)

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

PostgreSQL如何查询表结构和索引信息

《PostgreSQL如何查询表结构和索引信息》文章介绍了在PostgreSQL中查询表结构和索引信息的几种方法,包括使用`d`元命令、系统数据字典查询以及使用可视化工具DBeaver... 目录前言使用\d元命令查看表字段信息和索引信息通过系统数据字典查询表结构通过系统数据字典查询索引信息查询所有的表名可

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问