现在的位置: 首页 > 综合 > 正文

SolrJ的使用

2019年05月09日 ⁄ 综合 ⁄ 共 7232字 ⁄ 字号 评论关闭

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、  添加索引

Collection docs = 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


抱歉!评论已关闭.