luinstein 发表于 2012-12-12 11:44:30

SolrJ的使用

SolrJ覆盖了solr的全部功能,下面将自己在实际开发中所使用的程序粘贴出来并适当加以解释,由于本人比较菜,代码书写不是那么的精练,还请见谅。
1、 创建solrserver对象:try {            solr = newCommonsHttpSolrServer("http://localhost:8983/solr");            solr.setConnectionTimeout(100);            solr.setDefaultMaxConnectionsPerHost(100);            solr.setMaxTotalConnections(100);       } catch (Exception e) {            System.out.println("请检查tomcat服务器或端口是否开启!");            e.printStackTrace();       }
2、 添加索引Collection<SolrInputDocument>docs = newArrayList<SolrInputDocument>();       for (int i = 0; i < list.size(); i++) {            Item item = list.get(i);            //设置每个字段不得为空,可以在提交索引前进行检查            if (CheckItem(item)) {                     SolrInputDocument doc = new SolrInputDocument();                     //在这里请注意date的格式,要进行适当的转化,上文已提到                     doc.addField("id", item.getId());                     …………                     docs.add(doc);            }       }
       try {            solr.add(docs);            //对索引进行优化            solr.optimize();            solr.commit();       } catch (Exception e) {            e.printStackTrace();       }3、 使用bean对象添加索引      创建一个对应于solr索引的类别:      public class Item {            @Field            private String id;            …………            public void setId(String id) {                  this.id = id;            }            public String getId() {                  return id;            }            …………            public Item(){            }      }
      使用数据创建bean对象列表,       try{             solr.addBeans(beansList);             } catch (Exception e) {                  e.printStackTrace();             } finally {                  try {                           solr.optimize();                           solr.commit();                  } catch (Exception e) {                           e.printStackTrace();                  }             }      索引提交完毕。
4、 删除索引      据查询结果删除:             try{                  //删除所有的索引                  solr.deleteByQuery("*:*");                  solr.commit();             } catch (Exception e) {                  e.printStackTrace();             }
      根据索引号删除索引:      try {                  solr.deleteById(ids);                  solr.commit();             } catch (Exception e) {                  e.printStackTrace();             }
5、 查询      SolrJ提供的查询功能比较强大,可以进行结果中查询、范围查询、排序等。      下面是笔者封装的一个查询函数:public static QueryResponse Search(String[] field, String[] key,int start,

                  int count, String[] sortfield, Boolean[] flag, Boolean hightlight){

             //检测输入是否合法

             if (null == field || null == key || field.length != key.length){

                  return null;

             }

             if (null == sortfield || null == flag || sortfield.length !=flag.length) {

                  return null;

             }

             SolrQuery query = null;

             try {

                  //初始化查询对象

                  query = new SolrQuery(field + ":" + key);

                  for (int i = 0; i < field.length; i++) {

                           query.addFilterQuery(field + ":" + key);

                  }

                  //设置起始位置与返回结果数

                  query.setStart(start);

                  query.setRows(count);

                  //设置排序

                  for(int i=0; i<sortfield.length; i++){

                           if (flag) {

                                  query.addSortField(sortfield, SolrQuery.ORDER.asc);

                           } else {

                                  query.addSortField(sortfield, SolrQuery.ORDER.desc);

                           }

                  }

                  //设置高亮

                  if (null != hightlight) {

                           query.setHighlight(true); // 开启高亮组件

                           query.addHighlightField("title");// 高亮字段

                           query.setHighlightSimplePre("<fontcolor="red">");// 标记

                           query.setHighlightSimplePost("</font>");

                           query.setHighlightSnippets(1);//结果分片数,默认为1

                           query.setHighlightFragsize(1000);//每个分片的最大长度,默认为100

                  }

             } catch (Exception e) {

                  e.printStackTrace();

             }

             QueryResponse rsp = null;

             try {

                  rsp = solr.query(query);

             } catch (Exception e) {

                  e.printStackTrace();

                  return null;

             }

             //返回查询结果

             return rsp;

      }补充一下范围查询的格式:,start与end是相应数据格式的值的字符串形式,“TO”    一定要保持大写!
6、 读取查询结果      DocList读取返回结果:      SolrDocumentList solrList = rsp.getResults();
      Beans读取返回结果:      List<Item> tmpLists =rsp.getBeans(Item.class);
      读取高亮显示结果:rsp = Search(field, key, 0, 10, sortfield, flag, true);

                  if(null == rsp){

                           return;

                  }

                  Map<String, Map<String,List<String>>>hightlight = rsp.getHighlighting();

                  //Item即为上面定义的bean类

                  List<Item> tmpLists =rsp.getBeans(Item.class);

                  for (int i = 0; i < tmpLists.size(); i++){

                           //hightlight的键为Item的id,值唯一,我们设置的高亮字段为title

                           String hlString =hightlight.get(tmpLists.get(i).getId()).get("title").toString();

                           if (null != hlString) {

                                  System.out.println(hlString);

                           }

                  }7、 Facet的一个应用:自动补全 //prefix为前缀,min为最大返回结果数

      public static String[] autoComplete(String prefix, int min){

             String words[] = null;

             StringBuffer sb = new StringBuffer("");

             SolrQuery query = new SolrQuery("*.*");

             QueryResponse rsp= new QueryResponse();

             //Facet为solr中的层次分类查询

             try {

                  query.setFacet(true);

                  query.setQuery("*:*");

                  query.setFacetPrefix(prefix);

                  query.addFacetField("title");

                  rsp = solr.query(query);

             } catch (Exception e) {

                  // TODO: handle exception

                  e.printStackTrace();

                  return null;

             }

             if(null != rsp){

                  FacetField ff = rsp.getFacetField("title");

                  List<Count> countList =ff.getValues();

                  if(null == countList){

                           return null;

                  }

                  for(int i=0; i<countList.size(); i++){

                           String tmp[] = countList.get(i).toString().split(" ");

                           //排除单个字

                           if(tmp.length()< 2){

                                  continue;

                           }

                           sb.append(tmp + " ");

                           min--;

                           if(min == 0){

                                  break;

                           }

                  }

                  words = sb.toString().split(" ");

             }else{

                  return null;

             }

             return words;

      }二、总结
      在使用solr之前,笔者曾经用lucene与MMAnalyer自行搭建了一个索引搜索体系,由于要组合运用lucene的API,且lucene索引支持的数据格式有限,所以效率要大大低于solr,查询尚可,建立索引的速度差距尤为明显,Solr无疑是建立站内搜索等任务的首选。本人对于Solr的研究也是刚刚起步,希望能和更多的朋友交流、进步。
三、参考资料

1、 ITeye中Solr相关的网页

2、 累积:技海拾贝――Apache_Solr_初级教程.pdf

3、 solr_使用安装介绍.doc

4、 solr_DOC_CN.pdf

from:http://go.cxweb.com.cn/mkqzf
页: [1]
查看完整版本: SolrJ的使用