在EasyNet.Solr中,有两个接口最重要,一个是编解码器接口ICodec,一个是Solr输出结果解析器接口ISolrResponseParser<ST, DT>。
ICode定义如下;
View Code
1
///
<summary>
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的属性,这是
ICodecFactory很简单的一个接口,定义如下:
View Code
1
///
<summary>
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>定义如下;
View Code
1
///
<summary>
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>接口:
BinaryHighlightingParser:用来解析基于javabin协议的高亮结果
BinaryQueryResultsParser:用来解析基于javabin协议的查询对象集合结果
BinaryResponseHeaderParser:用来解析基于javabin协议的输出头结果
JsonHighlightingParser:用来解析基于json协议的高亮结果
JsonQueryResultsParser:用来解析基于json协议的查询对象集合结果
JsonResponseHeaderParser:用来解析基于json协议的输出头结果
XmlHighlightingParser:用来解析基于xml协议的高亮结果
XmlQueryResultsParser:用来解析基于xml协议的查询对象集合结果
XmlResponseHeaderParser:用来解析基于xml协议的输出头结果
当然将要发布的release版本中肯定会包含Facet查询解析器。
接口IUpdateOperationParametersConvert<T> ,用于更新所有操作参数转换,定义如下:
View Code
1
///
<summary>
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
}
针对javabin、xml、json,有以下类实现了IUpdateOperationParametersConvert<T>接口:
BinaryUpdateOperationParametersConvert:对应基于javabin协议的索引更新、提交、优化、回退、删除等操作
JsonUpdateOperationParametersConvert:对应基于json协议的索引更新、提交、优化、回退、删除等操作
XmlUpdateOperationParametersConvert:对应基于xml协议的索引更新、提交、优化、回退、删除等操作
对于Solr的更新、提交、优化、回退、删除索引操作,功能完全等同solrj,在索引更新时,可以同时添加提交、优化操作,进行一步处理。
本着简单的原则,对于Solr查询,我没有进行复杂的封装处理,查询接口ISolrQueryOperations<T> 非常简单,定义如下:
View Code
1
///
<summary>
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的具体使用和一些原则技巧。