public class SolrTestQuery { public static void main(String[] args) throws Exception{ String zkHost = "localhost:9080"; String defaultCollection = "collection1"; CloudSolrServer server = new CloudSolrServer(zkHost); server.setDefaultCollection(defaultCollection); SolrQuery params = new SolrQuery(); String q="俄罗斯空军"; //the common parameters for all search params.set("q", "content:"+q,"title:"+q); params.set("fl", "*,score"); // field list params.set("start", "0"); params.set("rows", "10"); params.setHighlightSimplePre("<em>"); params.setHighlightSimplePost("</em>"); params.addHighlightField("title"); params.addHighlightField("content"); params.addHighlightField("keywords"); params.setHighlight(true); params.setHighlightFragsize(72); params.setHighlightSnippets(3); params.setSort("score", ORDER.desc); params.setSort("updatetime", ORDER.desc); params.set("timeAllowed", "30000"); //miliseconds params.set("wt", "json"); // the response writer type //查询并获取相应的结果! QueryResponse response = null; try { response = server.query(params); SolrDocumentList results = response.getResults(); //高亮集合 Map<String, Map<String, List<String>>> highlightresult=response.getHighlighting(); for (int i = 0; i < results.size(); ++i) { SolrDocument document=results.get(i); System.out.println(document.get("id").toString()); if(highlightresult.get(document.get("id").toString())!=null && highlightresult.get(document.get("id").toString()).get("title")!=null){ String t=highlightresult.get(document.get("id").toString()). get("title").get(0); System.out.println(t); }else{ System.out.println(document.get("title")); } if(highlightresult.get(document.get("id").toString())!=null && highlightresult.get(document.get("id").toString()).get("content")!=null){ String t=highlightresult.get(document.get("id").toString()) .get("content").get(0); t=t.length()>72 ? t.substring(0, 72) : t; System.out.println(t); }else{ System.out.println(document.get("content")); } System.out.println(document.get("score")); } } catch (SolrServerException e) { System.err.println(e.getMessage()); e.printStackTrace(); } catch (Exception e) { System.err.println(e.getMessage()); e.printStackTrace(); } finally { server.shutdown(); } }}
hl.fl:高亮字段
hl.useFastVectorHighlighter:默认是false,即文本段的划分是按每50个字符 来划分,然后在这个50个字符中取关键字相关的摘要,摘要长度为100,参考后面的参数(hf.fragsize),如果我们在参数中指定值为true, 那么solr会根据关键词的在文本中的偏移量来计算摘要信息,前提是你的field要加上 termPositions=”true” termOffsets=”true”这两项。
hl.snippets:返回高亮摘要的段数,因为我们的文本一般都比较长,含有搜索关键字的地方有多处,如果hl.snippets的值大于1的话,会返回多个摘要信息,即文本中含有关键字的几段话,默认值为1,返回含关键字最多的一段描述。solr会对多个段进行排序。
hl.fragsize:摘要信息的长度。默认值是100,这个长度是出现关键字的位置向前移6个字符,再往后100个字符,取这一段文本。
hl.boundaryScanner:边界扫描,就是怎么取我们高亮摘要信息的起始位置和结束位置,这个是我们摘要信息的关键,因为我们模式高亮摘要的开始和结束可能是某句话中截段的。
hl.bs.maxScan:从关键字出现的位置往前6个字符开始向前,在maxScan个字符内找是否出现一个
hl.bs.chars:一个由参数hl.bs.chars指定的分界符。即从这里作为摘要的起始偏移。 如果往前maxScan个字符内没有发现指定的字符,则按起始值为start,即关键词往前的6个字符。
hl.requireFieldMatch: 默认值是false,意味着它可能匹配某个字段却高亮一个不同的 字段。如果hl.fl使用了通配符,那么就要启用该参数。尽管如此,如果你的查询是all字段(可能是使用copy-field 指令),那么还是把它设为false,这样搜索结果能表明哪个字段的查询文本未被找到。如果置为true,除非该字段的查询结果不为空才会被高亮。
hl.usePhraseHighlighter:如果一个查询中含有短语(引号框起来的)那么会保证一定要完全匹配短语的才会被高亮。
hl.highlightMultiTerm:如果使用通配符和模糊搜索,那么会确保与通配符匹配的term会高亮。默认为false,同时hl.usePhraseHighlighter要为true。
hl.mergeContiguous:如果被置为true,当snippet重叠时会merge起来。
hl.maxAnalyzedChars:会搜索高亮的最大字符,默认值为51200,如果你想禁用,设为-1
hl.alternateField:如果没有生成snippet(没有terms 匹配),那么使用另一个字段值作为返回。
hl.maxAlternateFieldLength:如果hl.alternateField启用,则有时需要制定alternateField的最大字符长度,默认0是即没有限制。所以合理的值为无限制。
hl.snippets * hl.fragsize这样返回结果的大小就能保持一致。
hl.formatter:一个提供可替换的formatting算法的扩展点。默认值是simple,这是目 前仅有的选项。显然这不够用,你可以看看org.apache.solr.highlight.HtmlFormatter.java 和 solrconfig.xml中highlighting元素是如何配置的.注意在不论原文中被高亮了什么值的情况下,如预先已存在的em tags,也不会被转义,所以在有时会导致假的高亮。
hl.fragmenter:这个是solr制定fragment算法的扩展点。gap是默认值。regex是 另一种选项,这种选项指明highlight的边界由一个正则表达式确定。这是一种非典型的高级选项。为了知道默认设置和fragmenters (and formatters)是如何配置的,可以看看solrconfig.xml中的highlight段。
hl.regex.pattern:正则表达式的pattern
hl.regex.slop:这是hl.fragsize能变化以适应正则表达式的因子。默认值是0.6,意思是如果hl.fragsize=100那么fragment的大小会从40-160.
参考资料:
http://wiki.apache.org/solr/HighlightingParameters