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:高亮字段java

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個字符,取這一段文本。apache

hl.boundaryScanner:邊界掃描,就是怎麼取咱們高亮摘要信息的起始位置和結束位置,這個是咱們摘要信息的關鍵,由於咱們模式高亮摘要的開始和結束多是某句話中截段的。json

hl.bs.maxScan:從關鍵字出現的位置往前6個字符開始向前,在maxScan個字符內找是否出現一個ui

hl.bs.chars:一個由參數hl.bs.chars指定的分界符。即從這裏做爲摘要的起始偏移。 若是往前maxScan個字符內沒有發現指定的字符,則按起始值爲start,即關鍵詞往前的6個字符。spa

hl.requireFieldMatch: 默認值是false,意味着它可能匹配某個字段卻高亮一個不一樣的 字段。若是hl.fl使用了通配符,那麼就要啓用該參數。儘管如此,若是你的查詢是all字段(多是使用copy-field 指令),那麼仍是把它設爲false,這樣搜索結果能代表哪一個字段的查詢文本未被找到。若是置爲true,除非該字段的查詢結果不爲空纔會被高亮。code

hl.usePhraseHighlighter:若是一個查詢中含有短語(引號框起來的)那麼會保證必定要徹底匹配短語的纔會被高亮。orm

hl.highlightMultiTerm:若是使用通配符和模糊搜索,那麼會確保與通配符匹配的term會高亮。默認爲false,同時hl.usePhraseHighlighter要爲true。server

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

相關文章
相關標籤/搜索