Solrj——Solr超强客户端

Solr 是一个独立的企业级搜索应用服务器,它对外提供类似于 Web-service 的 API 接口。用户可以通过 http 请求,向搜索引擎服务器提交一定格式的 XML 文件,生成索引;也可以通过 Http Get 操作提出查找请求,并得到 XML 格式的返回结果。这里主要讲解下通过 http Get 请求这种方式。首先,我们就必须通过 HTTP 请求类似 http://localhost:8989/solr/select?q=tags:t5 AND t7&fl=auction_id&start=0&rows=4&sort=auction_id desc,auction_point asc 的链接,对服务器进行访问。将最终结果以类似流的方式传回客户端。而具体形式是以 xml 的形式,类似下图:


Solrj 粉墨登场:
在 Solr 的连接请求,返回结果这一方面, Apache 已经为我们提供了 Solrj 这个工具,我们只需要简单的导入相关包,使用其简单的 API 就可以轻松对 solr 进行操作了。
首先我们导入相关的包,推荐大家使用 Maven ,在 pom.xml 的具体配置如下 :

Java代码 
<dependency> 
     <artifactId>solr-solrj</artifactId> 
     <groupId>org.apache.solr</groupId> 
     <version>1.4.0</version> 
     <type>jar</type> 
     <scope>compile</scope> 
</dependency> 
    包搞定了,开始Solrj !

    建立与Solr服务的连接
Java代码 
String url = "http://10.13.17.38:8983/solr"; 
        CommonsHttpSolrServer server = new CommonsHttpSolrServer(url); 
        server.setSoTimeout(3000); // socket read timeout 
        server.setConnectionTimeout(1000); 
        server.setDefaultMaxConnectionsPerHost(1000); 
        server.setMaxTotalConnections(10); 
        server.setFollowRedirects(false); // defaults to false 
        server.setAllowCompression(true); 
        server.setMaxRetries(1); 
 
   搜索条件的设置
Java代码 
SolrQuery query = new SolrQuery(); 
query.setQuery("tags:t5 AND t7"); 
        query.addField("auction_id"); 
        query.setStart(0); 
        query.setRows(4); 
        query.addSortField("auction_id", SolrQuery.ORDER.desc); 
        query.addSortField("auction_point", SolrQuery.ORDER.asc); 
    核心就是SolrQuery这个类,我们可以通过直接的setter方法,将我们需要搜索的字段,条件,升降序等等设置其中。   如:
   Field:为查询的字段;
   Query:是稀疏列Tags内两列取“&”的操作;
   Start和Rows:类似sql语法limit;
   SortField:为排序字段,升降序。
   ……
   这个的设置,完全等同于http请求http://localhost:8989/solr/select?q=tags:t5 AND t7&fl=auction_id&start=0&rows=4&sort=auction_id desc,auction_point asc 这个链接。
结果集获取
   结果集的获取Solrj提供两种方式,两种都是通过对象的方式直接获取结果,都不需要编写xml的解析。

    第一种方式:使用自带的SolrDocumentList类
Java代码 
QueryResponse qrsp = solrServer.query(query); 
        SolrDocumentList docs = qrsp.getResults(); 
   QueryResponse这个对象,看名字也可以猜测出来,是对Response的一次封装。而qrsp.getResults()获得对象正是Solrj帮我们做的最关键的操作。最终我们获得的对象SolrDocumentList,非常类似我们在jdbc里的ResultSet,我们得到我们想要的结果,只需一个简单的迭代就可以了。

Java代码 
QueryResponse qrsp = solrServer.query(query); 
        SolrDocumentList docs = qrsp.getResults(); 
   QueryResponse这个对象,看名字也可以猜测出来,是对Response的一次封装。而qrsp.getResults()获得对象正是Solrj帮我们做的最关键的操作。最终我们获得的对象SolrDocumentList,非常类似我们在jdbc里的ResultSet,我们得到我们想要的结果,只需一个简单的迭代就可以了。

Java代码 
SolrDocumentList docs = s.queryDoc(); 
        Iterator it = docs.iterator(); 
        while (it.hasNext()) { 
            System.out.println(it.next()); 
        } 
   此时,我们可以观察到,在控制台内打印出来的结果是:
Java代码 
[doumement:1] 
[doumement:2] 
[doumement:3] 
[doumement:4] 


  第二种方式:Solrj提供的注解的方式,注入pojo
   首先,我们要定义一个pojo类
Java代码 
import org.apache.solr.client.solrj.beans.Field; 
 
public class Item { 
    @Field 
    String id; 
 
    @Field("tags") 
    String[] tag; 
 
    @Field 
    List<String> features; 
 
  } 
  @Field("score") 
   public void setScore(String[] c){ 
       this.categories = c; 
   } 
    这个pojo类中的属性,就是我们查询结果的字段,值得注意的是,每个属性名称必须和字段名称一模一样。之后我们将所有的属性极其setter方法都写上 solrj提供的@Field注解,其他的和一个普通pojo类没有任何区别。通过注解的方式将结果数据有针对性注入pojo对象对应的属性当中。这块的原理很简单,如果有人有兴趣,我再写一篇关于注解方式注入pojo类属性值的文章。贴上一个demo给大家拍砖。言归正传,
调用:
Java代码 
QueryResponse qrsp = solrServer.query(query); 
        List<Item> productIds = qrsp.getBeans(Item.class); 
   调用QueryResponse的API,getBeans(),直接获得我们定义的Item对象List。这没什么好说的,太方便了!

优劣对比:

    请求方面:
    Without Solrj :如果采用http直接访问的方法,我们必然会用到httpclient请求Solr服务器。其中所有的搜索条件都必须通过拼接一个负责冗长的url,例如:q=tags:t5 AND t7&fl=auction_id&start=0&rows=4&sort=auction_id desc&…&...&… ,通过GET的方式,请求服务器。
    With Solrj :面对对象的思想,所有搜索条件均以setter属性的方式设置到其封装的对象当中。但是,实际上还是通过拼接url的方式,走http请求的方式再请求Solr服务器。
Result: 本质完全相同,有了Solrj,开发会省很多事,将很多开发中的体力活交给Solrj。但是直接拼接url的方式肯定比对象的方式灵活很多。因为其中不复杂,有兴趣的同学,可以给Solrj加个方法,直接在Solrj最终生成的url上加上任何字符串。

    获取结果方面:
    Without Solrj :结果的返回形式是xml文件,每条记录都会以document节点的形式记录。如果要获得Object对象,我们一般会用Dom4j或者xStream等技术对结果的xml进行解析。
    With Solrj :两种方式,均只有几行代码,直接获得结果。无需解析xml。优点显而易见!

    Result: 没啥好说,Solrj顶!
    说白了:
    Solrj仅仅是一个Solr的客户端,简化大家没必要的开发量。原理很简单,实现不复杂,属于专门为Solr造的一个轮子。

 

你可能感兴趣的:(solrj)