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、当单域查询的时候,就直接设置高亮格式,更加简单
运行结果:

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

6183

被折叠的 条评论
为什么被折叠?



