Lucene对多域搜索高亮显示

本文介绍了如何在Lucene项目中实现对多余搜索结果的高亮显示,包括环境配置、代码实例以及高亮搜索的详细步骤。通过使用SimpleHTMLFormatter和Highlighter类,实现了对主题和正文的高亮处理。

 Lucene对多余搜索高亮显示

一、环境

因为我的是lucene项目所以jar文件如下

 

二、代码实例

  说明:主要是搜索本地文档  

  实体类:

public class Dto implements Serializable{

   public String topic;//主题

   public String body;//正文

   public String path;//路径

高亮搜索代码:

/**
	 * @param content
	 *            要查找的内容
	 * @param page
	 *            显示第几页
	 * @param indexPath
	 * @return 所有符合查询条件和页码的查询结果
	 */
	public static List<Dto> searchDoc(String content, int page,
			int pageMaxCount, String indexPath) {// 进行分页显示,规定每一页显示pageMaxCount条
		dtos = new ArrayList<Dto>();
		try {
			// 创建一个搜索
			IndexSearcher indexSearch = new IndexSearcher(
					FSDirectory.open(new File(indexPath)));
			String searchString = content;// 要查找的内容
			String[] fields = new String[] { "topic", "body" };// 多域查询的域
			// 下面这个表示要同时搜索这两个域,而且只要一个域里面有满足我们的搜索的内容就行

			BooleanClause.Occur[] clauses = { BooleanClause.Occur.SHOULD,
					BooleanClause.Occur.SHOULD };
			// 创建query
			Query query = MultiFieldQueryParser.parse(Version.LUCENE_35,
					searchString, fields, clauses, ikAnalyzer);
			// 创建分页查询
			indexSearch.setSimilarity(new IKSimilarity());// 在索引器中使用IKSimilarity相似度评估
			TopScoreDocCollector results = TopScoreDocCollector.create(
					indexSearch.maxDoc(), false);
			indexSearch.search(query, results);
			// 当前页的第几条
			int start = (page - 1) * pageMaxCount + 1;// 当页显示的最小下标
			// 分页取值
			ScoreDoc[] docs = results.topDocs(start, pageMaxCount).scoreDocs;
			// 设置高亮格式
			SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter(
					"<font color='red'>", "</font>");
			// 查询一个Lucen的查询,并把查询出来的指定位置加上设定的高亮格式
			Highlighter highlighter = new Highlighter(simpleHTMLFormatter,
					new QueryScorer(query));
			// 设置含有关键字文本块的大小
			highlighter.setTextFragmenter(new SimpleFragmenter(60));
			for (int i = 0; i < docs.length; i++) {
				Document doc = indexSearch.doc(docs[i].doc);
				Dto dto = new Dto();
		
    			String topic = highlighter.getBestFragment(new IKAnalyzer(),
				"topic", doc.get("topic"));
    			if(topic==null){
    				topic=doc.get("topic");
    			}
				dto.setTopic(topic);
				if (doc.get("body").equals("null")) {
					dto.setBody("");
				} else {
					// 对body进行处理,由于创建索引的时候body太长有些用......代替结尾				
					String body = highlighter.getBestFragment(new IKAnalyzer(),
							"body", doc.get("body"));
					if(body==null){
						body=doc.get("body");
					}
					body=subStringByCotent(body, content);
					dto.setBody(body);
				}
				dto.setPath(doc.get("path"));
				dtos.add(dto);
			}
		} catch (CorruptIndexException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return dtos;
	}


总结:1、主要是利用SimpleHTMLFormatter类创建一个显示的格式

      2、Highlighter highlighter = new Highlighter(simpleHTMLFormatter,

new QueryScorer(query));

      3、String topic = highlighter.getBestFragment(new IKAnalyzer(),

"topic", doc.get("topic"));

      4、当多域查询的时候,当设置topic添加高亮的时候,程序只会查找出opic中有关键字的记录,如果没有记录就会该字段为空,如topic标题,所以此处

String topic = highlighter.getBestFragment(new IKAnalyzer(),

"topic", doc.get("topic"));

    if(topic==null){//没有关键字的时候就用原来的topic

    topic=doc.get("topic");

    }

      同理:查询body的时候也是一样

      5、当单域查询的时候,就直接设置高亮格式,更加简单

运行结果:

 

 

源码直接下载地址: https://pan.quark.cn/s/d280357b18e5 在网页构建领中,HTML5被视为当代网页工程的基础规范,其问世显著增强了页面的视觉表现力与用户互动性。本工程致力于运用HTML5技术开发一个电视剧信息展示页面,目的是呈现诸如剧名、演员构成、故事梗概等电视剧关键资料。接下来将深入阐释如何借助HTML5的结构化组件和样式管理功能达成此项目目标。 我们必须掌握HTML5的核心框架。一个规范的HTML5文档一般包含`<!DOCTYPE html>`声明、`<html>`根标记、`<head>`头部标记和`<body>`主体标记。在头部区,可以配置网页的基本元数据,例如字符集设定、页面标题等。在主体部分,将具体构建电视剧信息列表的内容。 电视剧展示页面通常包含个条目,每个条目对应一部电视剧。HTML5中的`<section>`标记用于内容模块化,适合表示单个电视剧的详细信息区。每个`<section>`内部,可使用`<h2>`标题标记显示剧名,`<img>`图像标记插入宣传剧照,`<p>`段落标记呈现剧情介绍,而`<ul>`无序列表与`<li>`列表项标记则用于罗列演员阵容。 为了优化页面布局,需要借助CSS(层叠样式表)进行样式管理。HTML5引入了创新的CSS选择器与布局模型,例如Flexbox和Grid,使页面布局更加灵活变。在此场景下,可以利用Flexbox为电视剧信息列表实现自适应布局,保障在不同设备尺寸下均能呈现理想视觉效果。具体操作时,可将`<section>`标记设定为Flex容器,通过`display: flex;`属性,并运用`justify-content`和`align-items`属性调整子元素的对...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值