上篇文章提到了环境搭建、与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]”)
未完待续……后续将关注一些高级的查询,敬请关注!