標籤:Lucene blog http color java 使用 os strong
solrj中配置:
- 兩種高亮開啟設定
- // solrParams.setHighlight(true);
-
- solrParams.setParam("hl", "true"); //highlighting
- 設定高亮欄位:
//高亮參數設定 那些欄位高亮顯示,可以用空格或者逗號分隔
solrParams.addHighlightField("title,content");//添加高亮域
或者:
solrParams.setParam("hl.fl","title,content");
- 高亮顯示欄位前後添加html代碼
solrParams.setHighlightSimplePre("<font color=\"red\">");
solrParams.setHighlightSimplePost("</font>");
- 設定高亮顯示字數
solrParams.setHighlightFragsize(params.getViewNums());
- 結果集返回:
//第一個Map的鍵是文檔的ID,第二個Map的鍵是高亮顯示的欄位名
if(highViews!=null && highViews.length()>0¶ms.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代碼
- <requestHandler name="search" class="solr.SearchHandler" default="true">
- <!-- default values for query parameters can be specified, these
- will be overridden by parameters in the request
- -->
- <lst name="defaults">
- <str name="echoParams">explicit</str>
- <int name="rows">10</int>
- <str name="df">text</str>
- <str name="hl">true</str>
- <str name="hl.fl">content</str>
- <str name="f.name.hl.fragsize">50</str>
- <str name="hl.simple.pre"><font color="red></str>
- <str name="hl.simple.post"></font></str>
- </lst>
- </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.