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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!