搜索中两种高亮显示方式
来源:互联网 发布:计算机基础与c语言 编辑:程序博客网 时间:2024/06/05 15:44
以下提供常见两种方式处理搜索时高亮显示。目前鉴于商麦系统中大量字段没有保存。solr返回ID。所以建议采用第一种方式处理。
处理方式为通过velocity模板工具注入工具类,提供静态方法。进行解析。达到高亮显示。
注意:高亮显示的分词器最好喝solr分词器一致
1、搜索词之后进行高亮显示。使用lucene处理高亮显示词
/**
* 用户分词高亮* 在content中查找keyword的字符串,若发现则加上高亮显示的标签。
* @param content 源内容。
* @param keyword 搜索关键字。
* @return 经过对关键字高亮显示的结果。
*/
public static String highLightHtmlForSearch(String content, String keyword ){
//检查参数。
if(StringUtils.isEmpty(content) || StringUtils.isEmpty(keyword))
return(content);
try {
long start = System.currentTimeMillis();
keyword = escapeSpecChar(keyword);
content = escapeSpecChar(content);
Query query = new QueryParser(Version.LUCENE_34, "fullText", new IKAnalyzer()).parse(keyword);
QueryScorer scorer = new QueryScorer(query);
Fragmenter fragment = new SimpleSpanFragmenter(scorer, HIGHLIGHT_SIZE);
SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("<em>", "</em>");
Highlighter highlighter = new Highlighter(formatter,scorer);
highlighter.setTextFragmenter(fragment);
highlighter.setMaxDocCharsToAnalyze(HIGHLIGHT_SIZE);
String str = highlighter.getBestFragment(new IKAnalyzer(), "fullText", content);//IKanalyzer分词器
if(!StringUtils.isBlank(str)){//如果存在关键字片段则处理
removeEmInHref(content);
content = HtmlUtils.htmlUnescape(removeEmInHref(str));
}
long time = System.currentTimeMillis()-start;
System.out.println(time);
if(content.contains("\\"))
content = content.replaceAll("\\\\", "");
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InvalidTokenOffsetsException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return content;
}
/**
*
* @Title: removeEmInHref
* @Description:去掉href里面em
* @param @param content
* @param @return 设定文件
* @return String 返回类型
* @throws
* @date 2012-11-30 下午08:26:53
*/
public static String removeEmInHref(String content){
String returnstr ="";
if(StringUtils.isBlank(content)){
return content;
}
Document doc = Jsoup.parseBodyFragment(content);
Elements links=doc.getElementsByTag("a");
if(null!=links&&links.size()>0){
for (Element link : links) {
String linkHref = link.attr("href");
if(!StringUtils.isEmpty(linkHref)){
String ss =linkHref.replace("<em>", "").replace("</em>", "");
link.attr("href", ss);
}
}
returnstr = doc.getElementsByTag("body").toString().replace("<body>", "").replace("</body>", "");
}else{
returnstr = content;
}
return returnstr.replaceAll("\n", "");
}
2、solrconfig.xml配置。一下配置是solrconfig.xml自带的。如果有的话就不用配置
(1)、solr文件configSolr配置
<!-- Configure the standard formatter -->
<formatter name="html"
default="true"
class="solr.highlight.HtmlFormatter">
<lst name="defaults">
<str name="hl.simple.pre"><![CDATA[<em>]]></str>
<str name="hl.simple.post"><![CDATA[</em>]]></str>
</lst>
</formatter>
solr效果图如下
(2)。客户端解析solr高亮显示
private final static String URL = "http://localhost:5080/solr";
private CommonsHttpSolrServer server = null;
@Before
public void init() {
try {
server = new CommonsHttpSolrServer(URL);
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
@Test
public void testLight() {
try {
//查询对象
SolrQuery query = new SolrQuery("name:apache solr");
//设置启用高亮,如果返回文本较长可加大setHighlightSnippets变量值比如设置为100.
query.setHighlight(true).setHighlightSnippets(100);
//设置合并
query.setParam("hl.mergeContiguous", true);
//设置高亮字段
query.setParam("hl.fl", "name,title");
QueryResponse res = server.query(query);
//获取高亮集合
Map<String,Map<String,List<String>>> hl = res.getHighlighting();
SolrDocumentList list = res.getResults();
System.out.println("高亮结果集:"+hl);
//循环匹配高亮集合
for(SolrDocument sd : list){
List<String> list_t = hl.get(sd.getFieldValue("id")).get("name");
if(list_t != null){
String temp = list_t.get(0);
System.out.println("高亮返回为:" + temp);
}
}
} catch (SolrServerException e) {
e.printStackTrace();
}
}
- 搜索中两种高亮显示方式
- Search Techniques 搜索方式
- 递归方式搜索文件
- 螺旋搜索方式
- 提高搜索性能方式
- lucene搜索方式+过滤
- Lucene-搜索方式
- Lucene搜索方式大合集
- Lucene搜索方式大合集
- Lucene搜索方式大合集
- Lucene搜索方式大合集
- Lucene搜索方式大合集
- Lucene搜索方式大合集
- unity3d搜索敌人方式
- Lucene 搜索方式
- ElasticSearch搜索方式
- 缩略图显示方式也就是分栏显示方式
- 圈地方式地人肉搜索是不现实的搜索方式
- flex 时间类型转换
- Android的Audio 系统
- mime type 与 dataflavor
- * 定义验证各种格式类型的正则表达式对象
- mysql导入和导出数据库
- 搜索中两种高亮显示方式
- 获得鼠标选中文本的事件兼容多种浏览器
- Java学习循序渐进之private,protected,public,默认修饰的访问权限
- python-mode+emacs24.1的execfile问题解决
- 查询工程中的图片是否被引用 对于后期优化非常有用
- 文件管理
- 程序学习过程中存在的误区
- 进程与线程的区别
- 创建iis网站后 局域网不能访问