关于文章搜索显示高亮
1.前言:
想要实现返回的搜索引擎的文章的关键搜索词是高亮的,可以使用lucene-highlighter 的功能来实现。
2. UnifiedHighlighter#
highlightWithoutSearcher`()
2.1 highlightWithoutSearcher
方法的主要功能是再给定的文本内容中高亮指定的查询词或短语,而不依赖于 IndexSearcher
(搜素引擎器)。
这种情况适用于不需要访问索引的情况,或者已经有了一个查询对象可以直接使用的情况。
UnifiedHighlighter unifiedHighlighter.highlightWithoutSearcher(String fied,Query query,String content,int maxPassages);
2.2 参数解析:
- fiied:通常用于指定要高亮的关键词或短语;如果这个字符串是空的(如:”“),那么高亮器不会使用这个参数来进行匹配,而是依赖于第二个参数中的查询对象。如果这个参数是非空的,那么高亮器就会使用这个参数作为高亮的依据,而忽略掉的第二个参数中的查询对象。
- query查询的对象:可能是个复杂的查询对象,包含多个查询条件,查询对象可以包含复杂的查询逻辑,例如布尔查询,短语查询等,高亮器会解析这个查询对象来确定文档中的哪些部分需要被高亮。
- content: 要高亮的文本内容
- maxPassages: 最大片段数
2.3 示例:
import org.apache.luncene.Query;
import org.apache.luncene.analysis.TokenStreaml;
import org.apache.luncene.analysis.StandardAnalyzer;
import org.apache.luncene.highlight.UnifiedHighlighter;
import org.apache.luncene.highlight.Highlighter;
import org.apache.luncene.highlight.SimpleHTMLFormatter;
//创建一个格式化器,用于指定高亮的标签
SimpleHTMLFormatter formatter=new SimpleHTMLFormatter("<em class="highlight">","</em>");
// 创建一个分析器,用于处理文本
StandardAnalyzer analyzer= new StandardAnalyzer();
//假设passquery是你的查询对象
Query passQuery= ....;
//创建UnifiedHighlighter 实例
UnifiedHighlight highlighter = new UnifiedHighlighter(analysis,passQuery,formatter);
//文档内容
String content = "Lucene is a high-performance, full-featured text search engine library. It is widely used for implementing search within websites, mailing lists, and other applications."
//高亮真篇文档
String highlightedContent= highlighter.highlighterWithoutSearcher("",passageQyery,content,-1);
然后前端可以根据修改样式来达到想要展示给用户的高亮结果
/* 如果你使用的是 <em> 标签 */
em {
background-color: yellow;
font-weight: bold;
}
/* 如果你使用了自定义的类名 */
.highlight {
background-color: yellow;
font-weight: bold;
}
3. xPathSelector
3.1
如果想要实现,在xml这篇文章中实现具体哪个节点下显示对应文本的高亮这种更加复杂的操作,就需要通过xPathSelector来先根据xpath路径找到对应节点的内容,然后根据内容实现高亮功能,最后在进行原文替换等。
3.2 XPathSelector的作用:
XPathSelector 是Saxon(一个流行的XSLT和XPath的处理库)中的一个类,用于执行xpath表达式并且获取结果;
它的主要功能包括:
- 执行xpath查询:
XPathSelector 可以编译和执行xpath表达式,返回对应的结果(节点,字符串,数字或其他)。 - 设置上下文:
设置查询的上下文节点,这样XPath表达式将在该节点上执行,如在xml文档中,你可以设置某个特定的节点作为上下文,然后再这个节点以及其子节点上执行xpath查询(segment Search) - 处理复杂的查询:
XPathSelector支持复杂的XPath表达式,包括函数调用,条件表达式等,可以处理多种数据类型,如节点集,序列,映射等; - 灵活性:
可以动态的改变XPath表达式,并再不同的上下文中多次执行,使得XPathSelector再需要频繁执行不同的查询的情况下非常有用。
3.3 示例:
假如你有一个xml文档。你想提取并高亮某些特定的内容,使用XPathSelector可以很方便的实现这一点
XML文档实例:
<bookstore>
<book>
<title>Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
使用XPathSelector提取并高亮标题
import net.sf.saxon.s9api.*;
import java.util.ArrayList;
import java.util.List;
public class XpathExample{
public static void main(string[] args)throws SaxonApiException{
// 创建processor实例
Processor processor=new Processor(false);
// 解析xml文档
XdmNode document = processor.newDocumentBuilder().build(new java.io.File("bookstore.xml"));
// 获取xPathSelector实例
XPathSelector xPathSelector=processor.newXPathCompiler().compile("//book/titile").load();
// 设置上下文节点
xPathSelector.setContextItem(document);
//执行xpath, 查询并获取结果迭代器
XdmSequenceIterator iter= xPathSelector.evalute().iterator();
// 存储结果
List<String> titles=new ArrayList<>();
//遍历结果集
While(iter.hasNext()){
XdmItem xdmItem= iter.next();
String title=xdmItem.getStringValue();
//高亮标题中的"Italian"
String highlightTitle= title.replace("Italian","<span class="highlight">Italian</span>");
titles.add(highlightTitile);
}
//输出结果
for(String title: titles){
System.out.println(title)}
}
}
4. 对比:
- XML结构化数据:
如果你处理的是XML数据,XPathSelector是更自然的选择,因为它直接支持xml结构和xpath查询
Lucene主要用于村文本搜索,不直接支持xml结构化的数据出口 - 精确控制:
使用xpathSelector,你可以精确的控制哪些部分可需要高亮,因为你可以填写复杂的XPath表达式来匹配特定的节点和内容
Lucene的高亮功能通常基于关键词匹配,可能不如XPath那么灵活和精确 - 性能:
对于小规模的xml文档,XPathSelector的性能通常是足够的
lucene的高亮功能虽然强大,但在处理大量数据时可能会引起额外的开销,尤其在不需要全文所搜的情况下 - 集成和依赖:
如果你的项目已经使用了Saxon或者其他的xml处理库,那么使用XPathSelector 可以减少额外的依赖和集成功作
引入lucene 可能会增加项目的复杂度和依赖管理的难度 - 应用场景:
XPathSelector 适用于需要对xml文档进行细粒度查询和操作的场景
lucene更加适用于大规模的文本搜索和高亮显示,特别是在需要全文检索和复杂的查询情况下。