Solr使用初探——SolrJ的使用

来源:互联网 发布:淘宝摄影技巧 编辑:程序博客网 时间:2024/04/30 00:54

二、SolrJ的使用

       SolrJ覆盖了solr的全部功能,下面将自己在实际开发中所使用的程序粘贴出来并适当加以解释,由于本人比较菜,代码书写不是那么的精练,还请见谅。

 

1、  创建solrserver对象:

try {

               solr = new CommonsHttpSolrServer("http://localhost:8983/solr");

               solr.setConnectionTimeout(100);

               solr.setDefaultMaxConnectionsPerHost(100);

               solr.setMaxTotalConnections(100);

        } catch (Exception e) {

               System.out.println("请检查tomcat服务器或端口是否开启!");

               e.printStackTrace();

        }

 

2、  添加索引

Collectiondocs = new ArrayList();

        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[0] + ":" + key[0]);

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

                            query.addFilterQuery(field[i] + ":" + key[i]);

                     }

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

                     query.setStart(start);

                     query.setRows(count);

                     //设置排序

                     for(int i=0; i

                            if (flag[i]) {

                                  query.addSortField(sortfield[i], SolrQuery.ORDER.asc);

                            } else {

                                  query.addSortField(sortfield[i], SolrQuery.ORDER.desc);

                            }

                     }

                     //设置高亮

                     if (null != hightlight) {

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

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

                            query.setHighlightSimplePre("");// 标记

                            query.setHighlightSimplePost("");

                            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;

       }

       补充一下范围查询的格式:[star t TO end]startend是相应数据格式的值的字符串形式,“TO     一定要保持大写!

 

6、  读取查询结果

       DocList读取返回结果:

       SolrDocumentList solrList = rsp.getResults();

 

       Beans读取返回结果:

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

 

       读取高亮显示结果:

                     rsp = Search(field, key, 0, 10, sortfield, flag, true);

                     if(null == rsp){

                            return;

                     }

                     Map>> hightlight = rsp.getHighlighting();

                     //Item即为上面定义的bean

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

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

                            //hightlight的键为Itemid,值唯一,我们设置的高亮字段为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();

              //Facetsolr中的层次分类查询

              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 countList = ff.getValues();

                     if(null == countList){

                            return null;

                     }

                     for(int i=0; i

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

                            //排除单个字

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

                                   continue;

                            }

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

                            min--;

                            if(min == 0){

                                   break;

                            }

                     }

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

              }else{

                     return null;

              }

              return words;

       }

 

二、总结

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

 

三、参考资料

1、  ITeyeSolr相关的网页

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

3、  solr_使用安装介绍.doc

4、  solr_DOC_CN.pdf



附代码和jar包(考虑到现在api会有变化,特传上我使用的版本)下载。

0 0