EasyNet.Solr架构

EasyNet.Solr架构

  http://easynet.codeplex

在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的具体使用和一些原则技巧。 

 

 

 

 

 

Lucene

 
摘要: 这个月月末准备办一个免费的Solr交流会,有兴趣的同学可以加入到QQ群:181963043报名参加。主要内容:1:Solr的基本架构和应用2:Solr分布式3:Solr性能优化4:基于Solr的全文检索架构5:Solr开发 6:EasyNet.Solr的应用地点可能在北京东四十条附近。 阅读全文
posted @  2012-05-11 09:37 TerryLiang 阅读(21) |  评论 (0)  编辑
 
摘要: 检索和推荐在电子商务运营中有着比较重要的地位,通过检索用户可以方便找到想要的商品,通过推荐,可以主动提供用户可能想要的商品,检索和推荐的应用,都增加了用户的购买和未来购买的可能性。基于用户的检索,不是和其他常见的检索一样,只要检索条件相同,都会出现同样的结果。每个用户都有各自的特性和偏好,在一个阶段内都有不同的动向,基于用户的检索平台,通过对用户行为数据的分析,得出用户的特性和偏好,甚至近期的动向,在检索中根据用户身份标识,展现给用户基于自己的结果。举个例子,比如一个用户在以往购买的商品或经常浏览的商品中,偏好蓝色,大尺码,而且价格一般比较高,那么检索平台提供给此用户的商品结果中,蓝色、大尺. 阅读全文
posted @  2011-07-20 16:29 TerryLiang 阅读(298) |  评论 (3)  编辑
 
摘要: 关于如何提高Solr的性能问题,可以参见Solr的官方指南:http://wiki.apache.org/solr/SolrPerformanceFactors,对于Lucene的性能问题,可以参考Lucene的官方指南:http://wiki.apache.org/lucene-java/BasicsOfPerformance。以下是本人在Solr应用中的一些小小的经验。1.关于系统平台的选择。本人建议部署在linux系统下,JRE和Tomcat最好采用最新版本,linux也要参考网上的一些资料,对其进行优化。根据实际软硬件,优化tomcat和jvm参数,tomcat采用nio conne. 阅读全文
posted @  2011-06-26 22:06 TerryLiang 阅读(1635) |  评论 (5)  编辑
 
摘要: 在上一边随笔EasyNet.Solr架构中,写道了EasyNet.Solr具有良好的扩展性,内置了对xml、json文本格式返回数据的处理。步骤如下:1.定义ICodecFactory,由于xml、json都是基于文本的,所以我们使用TextCodecFactory。2.创建指定ICodecFactory的Solr连接ISolrConnection。3. 创建ISolrQueryOperations<T>用于Solr查询,T为返回结构数据类型,此处应该为string类型。4.预先定义好的IObjectDeserialize<T>,对象反序列化接口实现。T为要反序列化为的 阅读全文
posted @  2011-05-05 01:02 TerryLiang 阅读(2023) |  评论 (1)  编辑
 
摘要: 在EasyNet.Solr中,有两个接口最重要,一个是编解码器接口ICodec,一个是Solr输出结果解析器接口ISolrResponseParser<ST, DT>。ICode定义如下;View Code 1///<summary>2///编解码器3///</summary>4publicinterfaceICodec5{6///<summary>7///对对象进行编码,并输出到流8///</summary>9///<paramname="obj">要进行编码的对象</param>10// 阅读全文
posted @  2011-05-03 00:13 TerryLiang 阅读(2233) |  评论 (5)  编辑
 
摘要: 今天早上的时候,突然想写写自己开发EasyNet.Solr的历程。在期间遇到了很多问题,比如架构问题、性能问题等等。我很想和大家分享一下自己的一些想法,我觉得谈不上什么经验,有不当的地方,欢迎大家拍砖。记得当时我决定用Solr做公司的全文检索应用,Solr给我的最初感觉就是功能完善, 性能也满足目前需求。但是在选择.Net客户端时,我却有些为难。当时只有两种选择SolrSharp和Solr.Net。SolrSharp已经很久没有更新了,于是最终决定用Solr.Net。因为我喜欢简单(我喜欢简单,我是凡客),所以自己在Solr.Net进行了精简。记得正式上线的晚上,在线上测试时,发现Solr.. 阅读全文
posted @  2011-04-28 16:46 TerryLiang 阅读(1471) |  评论 (4)  编辑
 
摘要: EasyNet.Solr(http://easynet.codeplex.com)是由本人开发的 solr(http://lucene.apache.org/solr)c#客户端。它具有以下特性:1.支持solr 3.1(不兼容solr 1.4.x)2. 默认支持solr最高效的javabin协议3.基于接口的序列化和反序列化协议,没有采用反射4. 可以在架构基础上方便扩展处理solr支持的其他协议,如xml,json等等以下是基本的使用示例:索引和检索用到的实体类 Indexing and retrieval of entity class usedpublic class Example. 阅读全文
posted @  2011-04-17 16:33 TerryLiang 阅读(2300) |  评论 (5)  编辑
 
摘要: 两台测试虚机,系统为REHL 5.3 x64,正常安装最新版本的JDK,正确设置SSH无密码登录。服务器一:192.168.56.101 dev1服务器二:192.168.56.102 dev2从http://apache.freelamp.com/hadoop/core/hadoop-0.20.1/下载hadoop-0.20.1.tar.gz,把hadoop-0.20.1.tar.gz拷贝到de... 阅读全文
posted @  2009-10-26 21:41 TerryLiang 阅读(1138) |  评论 (0)  编辑
 
摘要: 软件环境:操作系统:REHL 5JDK:JDK 1.6.0_16Tomcat: 6.0.20一:安装JDK从http://java.sun.com/javase/downloads/index.jsp下载JDK的RPM安装包jdk-6u16-linux-i586-rpm.bin,放在/home/apps(临时目录)下,在SSH Client中执行:# sh /home/apps/jdk-6u16-... 阅读全文
posted @  2009-09-12 16:21 TerryLiang 阅读(1532) |  评论 (0)  编辑
 
分类:  Lucene

你可能感兴趣的:(Solr)