Solrj Java API调用详解系列(二)

时间:2022-04-28 04:42:11

上篇文章提到了环境搭建、与Solr建立连接以及简单的查询如何实现。本文将继续介绍一些复杂的查询API如何使用。

一、           或者关系的查询

1、 SolrQuery.add(String, String… val)接口:

QueryResponse rsp = null;

LBHttpSolrServer hSolrServer = new LBHttpSolrServer(“http://localhost:8983/collection1_shard1_replica1”);;

SolrQuery query = new SolrQuery();

query.add(“name”,newString[]{“Zhangsan”,”Lisi”});//name是solr的schema.xml文件中定义的field名称。Zhangsan和Lisi是要查找的具体值。

try{

          rsp = hSolrServer.query(query);

}catch(SolrServerException e) {

         e.printStackTrace();

}catch(NullPointerExceptione){

         e.printStackTrace();

}

这样查询的结果就是name是Zhangsan或者Lisi的所有Documents。

注意:这里还有一个SolrQuery.set(Stringname, String… val)的接口,如果调用该接口,则将query中原有的field的值覆盖。即:如果之前调用了add(“name”,”Zhangsan”)。如果再调用set(“name”,”Lisi”),则查询的接口只能查到Lisi,name这个field的查询值被覆盖了。

2、 SolrQuery.add(SolrParams params)接口:

QueryResponse rsp = null;

LBHttpSolrServer hSolrServer = new LBHttpSolrServer(“http://localhost:8983/collection1_shard1_replica1”);;

SolrQuery query = new SolrQuery();

ModifiableSolrParams params = new  ModifiableSolrParams();

params.add("name", "Zhangsan");

query.add(params);

try{

          rsp =hSolrServer.query(query);

}catch (SolrServerException e) {

         e.printStackTrace();

}catch(NullPointerException e){

         e.printStackTrace();

}

 

以上两个接口慎用add和set方法。add可以追加,set可以覆盖。

 

二、           并且关系的查询

并且关系与或者关系只是在调用的API上有所区别,用法大体类似。

例如:查找所有名字叫Zhangsan,并且性别是男性的人员。

SolrQuery query = newSolrQuery();

query.add(“name”,”Zhangsan”);

query.addFilterQuery(“sex:male”);

大家可以看到,并且关系就是给solr的fq添加一个查询。所有的并且关系都添加到fq中即可。

三、           类SQL的in查询

例如:查找性别是男性,并且年龄是30岁和35岁的人员(注意:不是区间,而是年龄等于30或者35岁的人员)

SolrQuery query = new SolrQuery();

query.add(“sex:male”);

query.addFilterQuery(“age:30 age35”);//两个age中间用空格分隔

四、           区间查询

Solr的区间查询使用[~ TO ~]的形式进行。

如上例中:如果将年龄的条件稍做修改,改为:年龄在30~35岁之间的人员。

SolrQuery query = new SolrQuery();

query.add(“sex:male”);

query.addFilterQuery(“age:[30 TO 35]”);//TO两边有空格

如果是所用小于35岁的人员,则将30用通配符代替。即:query.addFilterQuery(“age:[* TO 35]”)

未完待续……后续将关注一些高级的查询,敬请关注!