前言
其实Solr3.4提供基于restful接口的服务,所以client使用任何语言都可以,但用client的访问方式可以提升开发效率。Solr官方推荐的客户端是Java写的solrj3.4和solr包中自带的ruby写的solr-ruby客户端。Solr-ruby的完善性我没查,直接用了solrj3.4。solrj的文档并不多,且很碎(solrj跟solr的文档都在http://wiki.apache.org,wiki的方式,且solr版本超多)。这里记录一些我用到的solrj的接口,备忘。
-------------------------------------------------------------------------------------------------------------------------------------------------------------
如何使用Solrj3.4连接solr服务器
Solrj3.4中,SolrServer作为solr服务器的抽象,ta是一个抽象类;更普遍的是使用CommonsHttpSolrServer对象作为solr服务器的实例,构建ta时需要传递两个参数,一个是solr服务器的url根地址,一个是new出来的HttpClient对象(在apache common包中)。实例代码如下:
HttpClient client = new HttpClient();
SolrServer solrServer = new CommonsHttpSolrServer("http://localhost:8983/solr", client);
如何使solrj3.4支持搜索结果高亮
- solr开关高亮的参数是hl,设为true表示返回结果带有高亮信息,设为false则没有,如果不指定,则默认是false;
- 高亮的域由hl.fl来指定,可指定用英文逗号分割的field名称,比如对content和title做高亮,就需要设置hl.fl=content,title;
- (更多的高亮参数可参见:http://wiki.apache.org/solr/HighlightingParameters)
在solr3.4中,高亮的参数是通过在SolrQuery对象中设置属性值来实现的,实例代码如下(摘自http://wiki.apache.org/solr/Solrj,有删减):
SolrQuery query = new SolrQuery();
query.setQuery("foo");
query.setParam("hl.fl", "content,title");
query.setParam("hl.mergeContiguous", "true");
QueryResponse queryResponse = getSolrServer().query(query);
参数获取高亮结果的实例代码如下(这段代码我需要实际测试下):
Iterator<SolrDocument> iter = queryResponse.getResults().iterator();
while (iter.hasNext()) {
SolrDocument resultDoc = iter.next();
String content = (String) resultDoc.getFieldValue("content");
String id = (String) resultDoc.getFieldValue("id"); //id is the uniqueKey field
if (queryResponse.getHighlighting().get(id) != null) {
List<String> highlightSnippets = queryResponse.getHighlighting().get(id).get("content");
}
}
Iterator<SolrDocument> iter = queryResponse.getResults().iterator();
while (iter.hasNext()) {
SolrDocument resultDoc = iter.next();
String content = (String) resultDoc.getFieldValue("content");
String id = (String) resultDoc.getFieldValue("id"); //id is the uniqueKey field
if (queryResponse.getHighlighting().get(id) != null) {
List<String> highlightSnippets = queryResponse.getHighlighting().get(id).get("content");
}
}
如何使用做复杂查询
对于这样的需求:“搜索出一定包含key1,且至少包含key2、key3、key4中一个的结果”。就需要用到solr的复杂查询了。我没细看solrj的语法,不过尝试了下这样写是满足需求的:key1 AND (key2 OR key3 OR key4)