设为首页收藏本站
开启辅助访问
切换到宽版

创星网络[分享知识 传递快乐]

 找回密码
 立即注册

QQ登录

只需一步,快速开始

用新浪微博登录

只需一步,快速搞定

搜索
查看: 4178|回复: 0
打印 上一主题 下一主题

SolrJ的使用

[复制链接]

我玩的应用:

跳转到指定楼层
楼主
发表于 2012-12-12 11:44:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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提供的查询功能比较强大,可以进行结果中查询、范围查询、排序等。
      下面是笔者封装的一个查询函数:
  1. public static QueryResponse Search(String[] field, String[] key,int start,

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

  3.              //检测输入是否合法

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

  5.                     return null;

  6.              }

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

  8.                     return null;

  9.              }

  10.              SolrQuery query = null;

  11.              try {

  12.                     //初始化查询对象

  13.                     query = new SolrQuery(field[0] + ":" + key[0]);

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

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

  16.                     }

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

  18.                     query.setStart(start);

  19.                     query.setRows(count);

  20.                     //设置排序

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

  22.                            if (flag) {

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

  24.                            } else {

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

  26.                            }

  27.                     }

  28.                     //设置高亮

  29.                     if (null != hightlight) {

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

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

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

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

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

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

  36.                     }

  37.              } catch (Exception e) {

  38.                     e.printStackTrace();

  39.              }

  40.              QueryResponse rsp = null;

  41.              try {

  42.                     rsp = solr.query(query);

  43.              } catch (Exception e) {

  44.                     e.printStackTrace();

  45.                     return null;

  46.              }

  47.              //返回查询结果

  48.              return rsp;

  49.       }
复制代码
补充一下范围查询的格式:[star t TOend],start与end是相应数据格式的值的字符串形式,“TO”    一定要保持大写!

6、 读取查询结果
      DocList读取返回结果:
      SolrDocumentList solrList = rsp.getResults();

      Beans读取返回结果:
      List<Item> tmpLists =rsp.getBeans(Item.class);

      读取高亮显示结果:
  1. rsp = Search(field, key, 0, 10, sortfield, flag, true);

  2.                     if(null == rsp){

  3.                            return;

  4.                     }

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

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

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

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

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

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

  11.                            if (null != hlString) {

  12.                                   System.out.println(hlString);

  13.                            }

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

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

  3.              String words[] = null;

  4.              StringBuffer sb = new StringBuffer("");

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

  6.              QueryResponse rsp= new QueryResponse();

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

  8.              try {

  9.                     query.setFacet(true);

  10.                     query.setQuery("*:*");

  11.                     query.setFacetPrefix(prefix);

  12.                     query.addFacetField("title");

  13.                     rsp = solr.query(query);

  14.              } catch (Exception e) {

  15.                     // TODO: handle exception

  16.                     e.printStackTrace();

  17.                     return null;

  18.              }

  19.              if(null != rsp){

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

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

  22.                     if(null == countList){

  23.                            return null;

  24.                     }

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

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

  27.                            //排除单个字

  28.                            if(tmp[0].length()< 2){

  29.                                   continue;

  30.                            }

  31.                            sb.append(tmp[0] + " ");

  32.                            min--;

  33.                            if(min == 0){

  34.                                   break;

  35.                            }

  36.                     }

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

  38.              }else{

  39.                     return null;

  40.              }

  41.              return words;

  42.       }
复制代码
二、总结
      在使用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
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|创星网络 ( 苏ICP备11027519号|网站地图  

GMT+8, 2024-9-22 06:51 , Processed in 0.077771 second(s), 22 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表