Solr搜索实例,增删改查+高亮+分页
jopen
11年前
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); }</div>
搜索高亮是找到关键字所在的记录域,然后追加前后缀,重新填充到对象,这里拆开来将是两个步骤,第一步设置高亮域,第二步查询结果追加渲染标记,填充到对象.所以这个可以抽取出来写成一个公用的方法
4.抽取高亮操作,实现公用方法
需要说明的是,这里的方法定义并不是很完善,因为反射的属性可能是一个集合,所以在利用反射转换之前,需要进行更精确地判断,这实例中实体对象中的属性为简单类型,所以这个方法可以处理.
5.junit测试
搜索结果集展示如下: