变量声明
private SimpleAnalyzer analyzer; private QueryParser qp; private Query query; private Fragmenter fragmenter; private SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter( "<span style='color:red'>", "</span>"); private Highlighter highlighter; private TokenStream tokenStream;
已实现高亮关键词,但是会被分词
//构建分词器 analyzer = new SimpleAnalyzer(); // 使用QueryParser查询分析器构造Query对象 qp = new QueryParser("", analyzer); // 空格表示or // qp.setDefaultOperator(QueryParser.); // 添加要查询的关键词 query = qp.parse(mp.get(i)[0]); // 添加链接样式 simpleHTMLFormatterURL = new SimpleHTMLFormatter("<a href='http://" + mp.get(i)[1] + "' target='view_blank' <span style='color:blue'> ", "</span> </a>"); highlighter = new Highlighter(simpleHTMLFormatterURL, new QueryScorer(query)); // 设置文本长度 fragmenter = new SimpleFragmenter(num); highlighter.setTextFragmenter(fragmenter); // 输出结果 tokenStream = analyzer.tokenStream("", new StringReader(field)); String tex = highlighter.getBestFragment(tokenStream, field);
要求是精确匹配,所以不需要用到分词器,第一次使用Lucene,可能注释有点不准确,请教大神!!
“已实现高亮关键词,但是会被分词”不太明白什么意思,可以举例说明一下
比如将“中华上下五千年历史”作为要添加高亮的文本,高亮词是“中华人民”,会被分词就是文中出现了“中华”也会被添加高亮
如果你使用Lucene的普通高亮组件Highlighter ,那么分词器是必须的,它需要把你的待高亮文本分词,再根据你的查询关键词去匹配然后高亮。你可以尝试着将查询关键词,使用粗粒度分词器分词,也就是“中华人民”分词的结果就是“中华人民”。类似,“中华人民”这样作为专有名字,在查询时不应该被分词,否则会影响搜索效果。