`

Solr-SolrJ基本操作

    博客分类:
  • solr
阅读更多

JAVA操作solr的实现其实很简单,但是很多细节要注意,在实际的开发中,很多人喜欢自己封装这些基础的方法以一个全新的“面貌”出现,其实都是一回事,操作熟了自然就会想到将一些实现功能用到的方法重新封装,这也是编程进阶的表现。

 

 

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

Collection<SolrInputDocument> docs = new ArrayList<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;

              }

             //qserver = new HttpSolrServer(url);

              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<sortfield.length; 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("<font color="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;

       }

       补充一下范围查询的格式:[star t TO end],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[0].length()< 2){

                                   continue;

                            }

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

                            min--;

                            if(min == 0){

                                   break;

                            }

                     }

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

              }else{

                     return null;

              }

              return words;

       }

 8、Solr Server与QServer

 

public static SolrServer getServer() {

        if (server == null) {

            String url = Configurations.getSolrServerUrl();

            server = new ConcurrentUpdateSolrServer(url, 500, 50);

        }

        return server;

    }

    

    public static SolrServer getQServer() {

        if (null == qserver) {

            String url = Configurations.getSolrServerUrl();

            qserver = new HttpSolrServer(url);

        }

        return qserver;

    }

      

  public void closeServer() throws Exception {

        ConcurrentUpdateSolrServer concurrentUpdateSolrServer = (ConcurrentUpdateSolrServer) server;

        concurrentUpdateSolrServer.shutdown();

        server = null;

        concurrentUpdateSolrServer = null;

    }       

分享到:
评论

相关推荐

    solr-solrj-4.9.0.jar

    solr-solrj-4.9.0.jar

    apache-solr-solrj-3.5.0.jar

    apache-solr-solrj-3.5.0.jar

    solr-solrj-6.6.0.jar

    solr-solrj-6.6.0.jar

    solr-solrj-4.4.0.jar

    solr-solrj-4.4.0.jar

    solr-solrj 5.0.0 demo

    以下是一个简单的示例,展示了如何使用Solr-Solrj进行索引操作和中文分词: ```java SolrServer server = new HttpSolrServer("http://localhost:8983/solr/core_name"); SolrInputDocument doc = new ...

    solr-solrj-6.1.0

    标题"solr-solrj-6.1.0"表明我们关注的是Solrj的一个特定版本,即6.1.0。这个版本可能包含了该时期Solrj的所有特性和修复的bug,对于理解和使用当时的Solrj功能至关重要。 描述中提到,Solr是一个企业级搜索应用...

    solr-solrj-4.10.3.jar和solr-solrj-5.0.0.jar

    这个压缩包包含了两个版本的SolrJ库:solr-solrj-4.10.3.jar和solr-solrj-5.0.0.jar。这两个版本的差异主要在于对Solr服务器的兼容性和功能改进。 首先,solr-solrj-4.10.3.jar是SolrJ的一个较旧版本,对应于Solr ...

    solr-solrj-5.5.0.jar

    solrJ是Java连接solr进行查询检索和索引更新维护的jar包。

    apache-solr-solrj-1.3.0

    solr的核心jar,大家可以一起好好学习一下,还是很优秀的

    apache-solr-solrj-3.2.0.jar

    jar包,亲测可用

    apache-solr-solrj-3.6.2.jar

    jar包,亲测可用

    solr-solrj-4.10.3.jar

    solr-solrj-4.10.3.jar。

    solr-core-4.6.0.jar solr-solrj-4.6.0.jar

    下载后会获得名为:solr_core.4.6.0 的zip包,解压后会获得solr-core-4.6.0.jar和 solr-solrj-4.6.0.jar两个文件,搭建solr全文检索环境必须要添加的包

    SolrJ6.3.0

    2. **solr-solrj-6.3.0.jar**:这个就是 SolrJ 的库文件,提供了与 Solr 服务器通信的接口和类。开发者可以使用这个库来创建 Solr 客户端实例,发送请求并接收响应,进行索引管理和查询操作。 3. **solr-langid-...

    solr-7.4.0.zip

    Solr,全称为Apache Solr,是一款开源的企业级全文搜索引擎,由Apache软件基金会开发并维护。它是基于Java的,因此在使用Solr之前,确保你的系统已经安装了Java 8或更高版本是至关重要的。标题"solr-7.4.0.zip"表明...

    solr-jar包

    总结来说,`solr-solrj-4.10.2.jar`是用于Java应用程序与Apache Solr服务器交互的重要工具,它简化了索引管理和查询操作。了解并熟练使用SolrJ,可以帮助开发者更高效地构建和维护具有强大搜索功能的应用程序。然而...

    apache-solr-3.5.0.jar

    这个名为"apache-solr-3.5.0.jar"的压缩包包含两个关键组件:`apache-solr-core-3.5.0.jar`和`apache-solr-solrj-3.5.0.jar`,它们对于成功搭建Solr 3.5.0环境至关重要。 1. `apache-solr-core-3.5.0.jar`: 这是...

    solr-parent.rar

    在这个"solr-parent.rar"压缩包中,我们主要关注的是 Solr 的两个关键组件:Solr-Core 和 Solr-Solrj。 1. **Solr-Core**: Solr-Core 是 Solr 的核心部分,包含了索引和查询的主要功能。它提供了文档的存储、索引...

    org.apache.servicemix.bundles.solr-solrj-4.6.1_1.zip

    标题 "org.apache.servicemix.bundles.solr-solrj-4.6.1_1.zip" 提供的信息表明,这是一个与Apache Solr相关的Java库,具体是SolrJ的版本4.6.1,由Apache ServiceMix组织打包。SolrJ是Apache Solr的Java客户端库,它...

Global site tag (gtag.js) - Google Analytics