当前位置: 首页 > solr, 搜索 > 正文

solr高亮查询实例

1 星2 星3 星4 星5 星 (2 次投票, 评分: 5.00, 总分: 5)
Loading ... Loading ...
baidu_share

solr4高亮查询例子:

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

本文固定链接: http://www.chepoo.com/solr-highlight-query-instance.html | IT技术精华网

solr高亮查询实例:等您坐沙发呢!

发表评论