solr 高亮配置

來源:互聯網
上載者:User

標籤:Lucene   blog   http   color   java   使用   os   strong   

solrj中配置:

  1. 兩種高亮開啟設定
  2. // solrParams.setHighlight(true);  
  3.    
  4. solrParams.setParam("hl", "true"); //highlighting  
 

 

  1. 設定高亮欄位:

      //高亮參數設定   那些欄位高亮顯示,可以用空格或者逗號分隔

      solrParams.addHighlightField("title,content");//添加高亮域

     

      或者:

                   solrParams.setParam("hl.fl","title,content");

  1. 高亮顯示欄位前後添加html代碼

              solrParams.setHighlightSimplePre("<font color=\"red\">");

      solrParams.setHighlightSimplePost("</font>");

 

  1. 設定高亮顯示字數

      solrParams.setHighlightFragsize(params.getViewNums());

 

  1. 結果集返回:

//第一個Map的鍵是文檔的ID,第二個Map的鍵是高亮顯示的欄位名

if(highViews!=null && highViews.length()>0&params.getIsHighlight()){

        String[] views= highViews.split(",");

      //高亮結果集

      Map<String,Map<String,List<String>>> map = response.getHighlighting();

      for(SolrDocument doc :list){

           for(String view : views){

              Map<String,List<String>> hl_map = map.get(doc.getFieldValue(Config.UNIQUEKEY));

              if(map!=null && hl_map!=null && hl_map.get(view)!=null && hl_map.get(view).size()>0){

                 doc.setField(view+Config.UNDERLINE+Config.HIGHLT, hl_map.get(view).get(0));

              }else{

                 doc.setField(view+Config.UNDERLINE+Config.HIGHLT, StringUtils.subString(doc.get(view),params.getViewNums()));

              }

           }

           hlList.add(doc);

        }

      result.setResults(hlList);

      }else{

        result.setResults(list);

      }

 

另外的方法,配置solrconfig.xml

solr是在lucene的基礎上做的開發,那麼在某些功能的實現上,與lucene也會有相似之處。
 
solr的高亮顯示(包括自動摘要),是通過hl這個param,以及其相關變數來實現的,hl是hightlight的簡寫。lucene中是通過highlighter來操作高亮和摘要的。
 
配置高亮的相關屬性,是在solrconfig.xml中配置的。在 <requestHandler name="search" class="solr.SearchHandler" default="true">下進行配置。solrconfig.xml檔案中包含多個requestHandler的標籤,但是只有在上述的名為search的標籤中配置才有效。現將配置的案列公布如下:


 

Xml代碼  
  1. <requestHandler name="search" class="solr.SearchHandler" default="true">  
  2.    <!-- default values for query parameters can be specified, these  
  3.         will be overridden by parameters in the request  
  4.      -->  
  5.     <lst name="defaults">  
  6.       <str name="echoParams">explicit</str>  
  7.       <int name="rows">10</int>  
  8.       <str name="df">text</str>  
  9.    <str name="hl">true</str>  
  10.    <str name="hl.fl">content</str>  
  11.    <str name="f.name.hl.fragsize">50</str>  
  12.    <str name="hl.simple.pre">&lt;font color=&quot;red&gt;</str>  
  13.    <str name="hl.simple.post">&lt;/font&gt;</str>  
  14.     </lst>  
  15.  </requestHandler>  

 

 

其中,hl是指定是否使用高亮;hl.fl,指定對哪些域進行高亮,對多個域進行高亮的話,好像是用逗號隔開;f.name.hl.fragsize是指摘要的長度,預設0代表不做摘要。而hl.simple.pre和hl.simple.post則是指定高亮時顯示的格式,預設是<em></em>。詳細內容請參見:http://wiki.apache.org/solr/HighlightingParameters。設定完成後,

在solrj中,通過QueryResponse對象的getHighlighting()方法獲得。該方法返回 Map<String,Map<String,List<String>>>類型的資料。其中第一個Map中的key是id,第二個Map中的key是field,List<String>中封裝的就是高亮與摘要處理過後的內容了

 

 


 Map<String, Map<String, List<String>>> map = response.getHighlighting();
 
 通過這個api的方法就可以得到高亮的內容,高亮的內容通過 key 跟索引的document部分關聯起來
 
 這個key就是document 的id
 
參數詳細說明:
 
 
 
 
 

?hl.fl: 用空格或逗號隔開的欄位列表。要啟用某個欄位的highlight功能,就得保證該欄位在schema中是stored。如果該參數未被給出,那麼就會高亮預設欄位 standard handler會用df參數,dismax欄位用qf參數。你可以使用星號去方便的高亮所有欄位。如果你使用了萬用字元,那麼要考慮啟用hl.requiredFieldMatch選項。
 ?hl.requireFieldMatch: 
如果置為true,除非該欄位的查詢結果不為空白才會被高亮。它的預設值是false,意味著它可能匹配某個欄位卻高亮一個不同的欄位。如果hl.fl使用了萬用字元,那麼就要啟用該參數。儘管如此,如果你的查詢是all欄位(可能是使用copy-field 指令),那麼還是把它設為false,這樣搜尋結果能表明哪個欄位的查詢文本未被找到
 ?hl.usePhraseHighlighter: 
如果一個查詢中含有短語(引號框起來的)那麼會保證一定要完全符合短語的才會被高亮。
 ?hl.highlightMultiTerm 
如果使用萬用字元和模糊搜尋,那麼會確保與萬用字元匹配的term會高亮。預設為false,同時hl.usePhraseHighlighter要為true。
 ?hl.snippets: 
這是highlighted片段的最大數。預設值為1,也幾乎不會修改。如果某個特定的欄位的該值被置為0(如f.allText.hl.snippets=0),這就表明該欄位被禁用高亮了。你可能在hl.fl=*時會這麼用。
 ?hl.fragsize: 
每個snippet返回的最大字元數。預設是100.如果為0,那麼該欄位不會被fragmented且整個欄位的值會被返回。大欄位時不會這麼做。
 ?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的邊界由一個Regex確定。這是一種非典型的進階選項。為了知道預設設定和fragmenters (and formatters)是如何配置的,可以看看solrconfig.xml中的highlight段。 
regex 的fragmenter有如下選項:
 ?hl.regex.pattern:Regex的pattern
 ?hl.regex.slop:這是hl.fragsize能變化以適應Regex的因子。預設值是0.6,意思是如果hl.fragsize=100那麼fragment的大小會從40-160.

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.