SolrJ API 官方文档最佳实践
以下内容译自Solr Wiki官方文档,版权没有,随意转载.
Solrj 是一个访问solr的Java客户端。它提供了一个java接口用于添加更新和查询solr索引。本页面介绍SolrJ最新版本1.4在Solr 1.4.x及其在附带war包中的使用,关于SolrJ在Solr1.3和Solr1.2的使用教程请移步Solrj1.3 Wiki。
SolrJ/Solr版本交叉的兼容性说明
SolrJ通常保持向后兼容性,因此你可以在较老版本的Solr上使用较新版本的SolrJ,或者在较新版本的Solr上使用较老版本的SolrJ。但是有些细微的区别需要注意:
如果你混合使用1.x和较新的主版本,必须设置响应XML解析器,因为两个版本使用了不兼容的Java bin。
server.setParser(new XMLResponseParser());
只要不将发起请求改变成二进制流,混合使用3.x和4.x或者混合之后的版本,通常没有太大问题(在SOLR-3038中有关于将默认请求改为二进制流的讨论)。如果这样做,3.x和更高版本的兼容性问题需要通过发起一个明确描述XML的版本的请求来决定。在SOLR-4820中有关于自动传输检测这种行为的讨论。
Java bin的格式是个例外,它在各个大版本之间互不兼容。不能使用javabin在1.4.1和以上版本或者3.1和更高版本之间通信(因为在协议中改变了字符编码)。也不能采用java bin的方式用于4.x的客户端和包括3.x在内之前版本的服务端进行通信,因为这样的改变会妨碍服务url的映射,也违反了向后不兼容的协议。在这种情况下,仅仅是不提供SolrServer的请求写入流,仍然可以得到默认的(XML)线性格式。
如果使用较老版本的SolrJ和4.x或者更新的Solr服务,很大可能是因为想从4.0的SolrJ中得到在之前的老版本的SolrQuery对象中所没有的setRequestHandler方法。值得注意的是,这个方法尤为重要当SolrJ比Solr要更新的时候。
设置Classpath
SolrJ用到的jar包分布在以下几个文件夹:/dist、/dist/solrj-lib 和 /lib,使用SolrJ最小可用jar包集合(可根据使用场景获取更多依赖)清单如下:
/dist文件夹
- apache-solr-solrj-*.jar
/dist/solrj-lib文件夹
- commons-codec-1.3.jar
- commons-httpclient-3.1.jar
- commons-io-1.4.jar
- jcl-over-slf4j-1.5.5.jar
- slf4j-api-1.5.5.jar
/lib文件夹
- slf4j-jdk14-1.5.5.jar
Maven
SolrJ可以从官方Maven库中获得,在pom.xml中添加如下依赖即可使用SolrJ相关API:
<dependency> <artifactId>solr-solrj</artifactId> <groupId>org.apache.solr</groupId> <version>1.4.0</version> <type>jar</type> <scope>compile</scope> </dependency>
如果需要使用EmbeddedSolrServer模式,同时需要添加Solr Core的依赖:
<dependency> <artifactId>solr-core</artifactId> <groupId>org.apache.solr</groupId> <version>1.4.0</version> <type>jar</type> <scope>compile</scope> </dependency>
另外,使用EmbeddedSolrServer时需要注意SolrJ依赖Servlet API,通常Servlet API已经作为Web项目的基础依赖包含在项目中,但即时是命令行项目,同样需要包含Servlet API依赖:
<dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency>
如果程序中抛出NoClassDefFoundError异常,则可能需要如下依赖:
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.5.6</version> </dependency>
如果使用Solr-SolrJ 1.4.1和Slf4j-simple 1.5.6,可能会由于slf4j-api的改变引起IllegalAccessError,SolrJ建议使用slf4j-api 1.5.5和slf4j-simple 1.5.5或者其他的适当版本。