Solr搜索實例,增刪改查+高亮+分頁
1.配置schema.xml文件[solr\collection1\conf\目錄下]
因為schema默認定義了一些Field,我們這里選取[id,title,description, author]這幾個屬性,將id主鍵type配置為string,其它幾個type配置為自定義的ik分詞器
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> <field name="title" type="text_ik" indexed="true" stored="true" multiValued="true"/> <field name="description" type="text_ik" indexed="true" stored="true"/> <field name="author" type="text_ik" indexed="true" stored="true"/> <field name="keywords" type="text_ik" indexed="true" stored="true"/>
Ik分詞器定義如下
<!--定義IK分詞類型-->
<fieldType name="text_ik" class="solr.TextField">
<!--索引時候的分詞器-->
<analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
<!--查詢時候的分詞器-->
<analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>2. 編寫solr操作類SearchEngine.java,solrJ操作索引參看文章: http://www.cnblogs.com/dennisit/p/3623974.html
3.這里演示solrj搜索高亮
/**
* solrJ搜索 高亮顯示
*
* @author pudongping
*
* @param server
* solr客戶端
* @param queryString
* 查詢串
* @param pageNum
* 分頁 頁碼
* @param pageSize
* 每頁顯示大小
* @return
*/
public static Page<QzoneArticle> queryComHighlight(SolrServer server, String queryString, int pageNum,int pageSize){
SolrQuery query = new SolrQuery();
query.setQuery(queryString);
query.setHighlight(true);//開啟高亮功能
query.addHighlightField("description");//高亮字段
query.addHighlightField("keywords");
query.setHighlightSimplePre("<font color='red'>");//渲染標簽
query.setHighlightSimplePost("</font>");//渲染標簽
query.setStart((pageNum-1)*pageSize);
query.setRows(pageSize);
QueryResponse response = null;
try {
response = server.query(query);
} catch (SolrServerException e) {
e.printStackTrace();
return null;
}
//查詢結果集
SolrDocumentList lists = response.getResults();
//對象結果集
List<QzoneArticle> items = new ArrayList<QzoneArticle>();
//查詢到的記錄總數
long totalRow = Long.valueOf(response.getResults().getNumFound()).intValue();
String tmpId = "";
Map<String,Map<String,List<String>>> highlightMap=response.getHighlighting();
for (SolrDocument solrDocument : lists) {
QzoneArticle at = new QzoneArticle();
tmpId=solrDocument.getFieldValue("id").toString();
at.setId(tmpId);
at.setAuthor(solrDocument.getFieldValue("author").toString());
List<String> descList=highlightMap.get(tmpId).get("description");
List<String> keywsList=highlightMap.get(tmpId).get("keywords");
if(descList!=null && descList.size()>0){
at.setDescription(descList.get(0));
}else{
//獲取并設置高亮的字段title
at.setDescription(solrDocument.getFieldValue("description").toString());
}
if(keywsList!=null && keywsList.size()>0){
at.setKeywords(keywsList.get(0));
}else{
at.setKeywords(solrDocument.getFieldValue("keywords").toString());
}
items.add(at);
}
//填充page對象
return new Page<QzoneArticle>(pageNum, pageSize, totalRow, items);
}
搜索高亮是找到關鍵字所在的記錄域,然后追加前后綴,重新填充到對象,這里拆開來將是兩個步驟,第一步設置高亮域,第二步查詢結果追加渲染標記,填充到對象.所以這個可以抽取出來寫成一個公用的方法
4.抽取高亮操作,實現公用方法
需要說明的是,這里的方法定義并不是很完善,因為反射的屬性可能是一個集合,所以在利用反射轉換之前,需要進行更精確地判斷,這實例中實體對象中的屬性為簡單類型,所以這個方法可以處理.
5.junit測試
搜索結果集展示如下:
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!