使用solr搭建的一个简易版的搜索实例(5)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
response = server.query(query); } catch (SolrServerException e) {
e.printStackTrace(); return null; }
苏若年 博客地址 http://www.cnblogs.com/dennisit
//查询到的记录总数 long totalRow = Long.valueOf(response.getResults().getNumFound()).intValue(); //查询结果集 List<T> items = new ArrayList<T>();
4. 抽取高亮操作,实现公用方法
/**
* 根据关键字查询 [测试通过 - 使用 solr内部转换机制]
* @param <T>
* @param server solr客户端
* @param keyword 搜索关键字
* @param pageNum 当前页码
* @param pageSize 每页显示的大小
for(SolrDocument solrDocument : solrDocuments) {
obj = clzz.newInstance();
Collection<String> fieldNames = solrDocument.getFieldNames();
//得到所有的属性名
for (String fieldName : fieldNames) {
苏若年 博客地址 http://www.cnblogs.com/dennisit
自己写的一个 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>
return null; } //查询结果集 SolrDocumentList lists = response.getResults();
//对象结果集 List<QzoneArticle> items = new ArrayList<QzoneArticle>();
//查询到的记录总数 long totalRow = Long.valueOf(response.getResults().getNumFound()).intValue();
SolrQuery query = new SolrQuery();
query.setQuery(queryString);
query.setHighlight(true);//开启高亮功能
query.addHighlightField("description");//高亮字段
query.addHighlightField("keywords");
query.addHighlightField(hlf); } //渲染标签 query.setHighlightSimplePre(preTag); query.setHighlightSimplePost(postTag); //分页查询 query.setStart((pageNum-1)*pageSize); query.setRows(pageSize); QueryResponse response = null; try {
if(f.getName().equals(fieldName)){
//获取到的属性名 //private java.lang.String com.test.model.Article.id f = clzz.getDeclaredField(fieldName);
苏若年 博客地址 http://www.cnblogs.com/dennisit
} if(keywsList!=null && keywsList.size()>0){ at.setKeywords(keywsList.get(0));
}else{ at.setKeywords(solrDocument.getFieldValue("keywords").toString());
* @param clzz
对象类型
苏若年 博客地址 http://www.cnblogs.com/dennisit
* @return */ public static <T>Page<T> queryHighter(SolrServer server,String solrql,
int pageNum,int pageSize,List<String> hlField, String preTag,String postTag,Class<T> clzz,String idName){ SolrQuery query = new SolrQuery(); query.setQuery(solrql); //设置高亮显示 query.setHighlight(true); //添加高亮域 for(String hlf : hlField){
2. 编写 solr 操作类 SearchEngine.java,solrJ 操作索引参看文章: http://www.cnblogs.com/dennisit/p/3623974.html
3. 这里演示 solrj 搜索高亮 /** * solrJ搜索 高亮显示 * * @author pudongping
//属性类型 //private java.lang.Leabharlann Baidutring com.test.model.Article.id fieldType = f.getType();
//构造set方法名 setId String dynamicSetMethod = dynamicMethodName(f.getName(), "set");
} items.add(at);
}
//填充page对象 return new Page<QzoneArticle>(pageNum, pageSize, totalRow, items);
} 搜索高亮是找到关键字所在的记录域,然后追加前后缀,重新填充到对象,这里拆开来将是两个步骤,第一步设置高亮域,第二步查询结果追加渲染标记,填充到对象.所以这个可以 抽取出来写成一个公用的方法
QueryResponse response = null;
try {
response = server.query(query);
} catch (SolrServerException e) {
e.printStackTrace();
苏若年 博客地址 http://www.cnblogs.com/dennisit
at.setDescription(descList.get(0)); }else{
//获取并设置高亮的字段title at.setDescription(solrDocument.getFieldValue("description").toString());
苏若年 博客地址 http://www.cnblogs.com/dennisit
query.setHighlightSimplePre("<font color='red'>");//渲染标签
query.setHighlightSimplePost("</font>");//渲染标签
query.setStart((pageNum-1)*pageSize);
query.setRows(pageSize);
//需要说明的是返回的结果集中的FieldNames()比类属性多
Field[] filedArrays = clzz.getDeclaredFields();
//获取类中所有属性
for (Field f : filedArrays) {
//如果实体属性名和查询返回集中的字段名一致,填充对应的set方法
//获取方法 //public void com.test.model.Article.setId(java.lang.String) m = clzz.getMethod(dynamicSetMethod, fieldType);
苏若年 博客地址 http://www.cnblogs.com/dennisit
*
* @param server
*
solr客户端
* @param queryString
*
查询串
* @param pageNum
*
分页 页码
* @param pageSize
*
每页显示大小
* @return
*/
public static Page<QzoneArticle> queryComHighlight(SolrServer server, String queryString, int pageNum,int pageSize){
//查询结果集
SolrDocumentList solrDocuments = response.getResults();
try {
Object obj = null;
Method m = null;
Class<?> fieldType = null;
Map<String,Map<String,List<String>>> highlightMap=response.getHighlighting();
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){
相关文档
最新文档