在EasyNet.Solr中,有两个接口最重要,一个是编解码器接口ICodec,一个是Solr输出结果解析器接口ISolrResponseParser<ST, DT>。
ICode定义如下;
2 /// 编解码器
3 /// </summary>
4 public interface ICodec
5 {
6 /// <summary>
7 /// 对对象进行编码,并输出到流
8 /// </summary>
9 /// <param name="obj"> 要进行编码的对象 </param>
10 /// <param name="stream"> 输出流 </param>
11 void Marshal( object obj, Stream stream);
12
13 /// <summary>
14 /// 对流进行解码
15 /// </summary>
16 /// <param name="stream"> 要解码的流 </param>
17 /// <returns> 解码后的对象 </returns>
18 object Unmarshal(Stream stream);
19 }
EasyNet.Solr内置了两个编解码器实现:JavaBinCodec,TextCodec。JavabinCodec对应Solr中基于javabin协议,TextCodec对应Solr中的xml、json等基于文本的协议。相应定义了BinaryCodecFactory,用于创建JavabinCodec,TextCodecFactory用于创建TextCodec。在SolrConnection中有个CodecFactory的属性,这是
2 /// 编解码工厂
3 /// </summary>
4 public interface ICodecFactory
5 {
6 /// <summary>
7 /// 创建编解码器
8 /// </summary>
9 /// <returns></returns>
10 ICodec CreateCodec();
11 }
为了更好的分离及扩展,我没有把SolrConnection设计的很复杂,它就是很简单的用ICodecFactory创建编解码器ICodec,然后把javabin协议对应的NamedList,或者基于xml、json等文本协议对应的字符串写入流,用于更新索引等操作,把输出流转换为javabin协议对应的NamedList,或者字符串文本,用于Solr返回结果处理。
ISolrResponseParser<ST, DT>定义如下;
2 /// Solr返回解析器泛型接口
3 /// </summary>
4 /// <typeparam name="ST"> ST类型返回数据 </typeparam>
5 /// <typeparam name="DT"> DT类型要解析为的数据 </typeparam>
6 public interface ISolrResponseParser < ST, DT >
7 {
8 DT Parser(ST result);
9 }
针对javabin、xml、json,有以下类实现了ISolrResponseParser<ST, DT>接口:
BinaryQueryResultsParser:用来解析基于javabin协议的查询对象集合结果
BinaryResponseHeaderParser:用来解析基于javabin协议的输出头结果
JsonQueryResultsParser:用来解析基于json协议的查询对象集合结果
JsonResponseHeaderParser:用来解析基于json协议的输出头结果
XmlQueryResultsParser:用来解析基于xml协议的查询对象集合结果
XmlResponseHeaderParser:用来解析基于xml协议的输出头结果
当然将要发布的release版本中肯定会包含Facet查询解析器。
接口IUpdateOperationParametersConvert<T> ,用于更新所有操作参数转换,定义如下:
2 /// Solr更新操作参数选项转换器泛型接口
3 /// </summary>
4 /// <typeparam name="T"> 转换为的数据类型 </typeparam>
5 public interface IUpdateOperationParametersConvert < T >
6 {
7 /// <summary>
8 /// 转换提交参数
9 /// </summary>
10 /// <param name="commitOptions"> 提交选项 </param>
11 /// <returns> T类型数据 </returns>
12 T ConvertCommitParameters(CommitOptions ? commitOptions);
13
14 /// <summary>
15 /// 转换优化参数
16 /// </summary>
17 /// <param name="optimizeOptions"> 优化选项 </param>
18 /// <returns> T类型数据 </returns>
19 T ConvertOptimizeParamters(OptimizeOptions ? optimizeOptions);
20
21 /// <summary>
22 /// 转换回退参数
23 /// </summary>
24 /// <returns> T类型数据 </returns>
25 T ConvertRollbackParameters();
26
27 /// <summary>
28 /// 转换添加操作参数
29 /// </summary>
30 /// <param name="docs"> Solr输入文档 </param>
31 /// <param name="addOptions"> 添加选项 </param>
32 /// <param name="commitOptions"> 提交选项 </param>
33 /// <param name="optimizeOptions"> 优化选项 </param>
34 /// <returns> T类型数据 </returns>
35 T ConvertAddParameters(IList < SolrInputDocument > docs, AddOptions ? addOptions, CommitOptions ? commitOptions, OptimizeOptions ? optimizeOptions);
36
37 /// <summary>
38 /// 转换删除参数
39 /// </summary>
40 /// <param name="ids"> 可迭代的键值 </param>
41 /// <param name="queries"> 可迭代的查询 </param>
42 /// <param name="commitOptions"> 提交选项 </param>
43 /// <param name="optimizeOptions"> 优化选项 </param>
44 /// <returns> T类型数据 </returns>
45 T ConvertDeleteParameters(IEnumerable < string > ids, IEnumerable < ISolrQuery > queries, CommitOptions ? commitOptions, OptimizeOptions ? optimizeOptions);
46 }
JsonUpdateOperationParametersConvert:对应基于json协议的索引更新、提交、优化、回退、删除等操作
XmlUpdateOperationParametersConvert:对应基于xml协议的索引更新、提交、优化、回退、删除等操作
对于Solr的更新、提交、优化、回退、删除索引操作,功能完全等同solrj,在索引更新时,可以同时添加提交、优化操作,进行一步处理。
本着简单的原则,对于Solr查询,我没有进行复杂的封装处理,查询接口ISolrQueryOperations<T> 非常简单,定义如下:
2 /// Solr查询操作泛型接口
3 /// </summary>
4 /// <typeparam name="T"></typeparam>
5 public interface ISolrQueryOperations < T >
6 {
7 /// <summary>
8 /// 查询
9 /// </summary>
10 /// <param name="query"> Solr查询 </param>
11 /// <param name="options"> 查询参数 </param>
12 /// <returns> T类型数据 </returns>
13 T Query(ISolrQuery query, NameValueCollection options);
14 }
可以参考Solr的wiki(http://wiki.apache.org/solr/),利用EasyNet.Solr.Commons.Params下定义的各种参数,构建查询字符串和查询选项。
下一篇将介绍EasyNet.Solr的具体使用和一些原则技巧。