为什么要封装

真不知道用什么标题合适,我这几天在研究Lucene.Net,觉得把Lucene.Net封装为一个独立的服务器,再提供一个给客户端调用的Api组件应该是一件很意思的事,主要优势有以下:

1、可以将索引和检索的压力放到网络的其它主机上,服务器不用再开发,直接运行就可以;

2、客户端完全可以脱离Lucene.Net,只要关心相关的几个Api就可以;

3、多个客户端也可以共用同一个索引,也可以不共用。

如上图,所有的客户端都只依赖于提供的Api组件,就可以操作Lucene服务器了。

APi组件

对于客户端而已,只需要关注APi组件,这个APi组件命名为LuceneLib,提供设置索引、删除索引、查询索引方法:

紧密结合C#语言的APi风格

因为客户端与Api是直接接触的,所以如何将APi设计为简单易用将面临下面的挑战:

1、APi在设置索引或查询索引时,Model为强类型;

2、查询索引时,有很多相关参数,比如关键字、查询的字段、排序字段、是否关键字高亮、如何高亮、分页功能。

LuceneLib给出紧密结合C#语言的APi风格,并完美地解决了上面两个难题:

使用泛型,强类型模型自动转换为通讯传输层的模型,反过来也是,所以服务器可以不用知道客户端的MODEL的类型。

        /// <summary>
/// Model为News索引名为Index_News
/// </summary>
private Lucene<News> client = new Lucene<News>("Index_News"); /// <summary>
/// 设置索引
/// </summary>
/// <param name="title">标题</param>
/// <param name="content">内容</param>
/// <returns></returns>
private async Task<bool> SetIndex_Test(string title, string content)
{
var news = new News
{
Id = Guid.NewGuid(),
OrderIndex = Environment.TickCount,
CreateTime = DateTime.Now,
Title = title,
Content = content
};
return await client.SetIndex(news);
}

LINQ风格的索引查询Api,各项调用不按顺序或省略相关项都不影响结果,MatchField方法提供N种重载,可以实现个性化的搜索结果。

        /// <summary>
/// 索引查询
/// </summary>
/// <param name="keywords"></param>
/// <returns></returns>
private async Task<List<News>> SearchIndex_Test(string keywords)
{
return await client
.SearchIndex(keywords)
.MatchField(item => item.Title, "high-light")
.MatchField(item => item.Content, Color.Red, )
.OrderByDescending(item => item.OrderIndex)
.Skip()
.Take()
.ToList();
}

相关技术

1、讯功能依赖于NetworkSocket项目,https://github.com/xljiulang/NetworkSocket,所有Api都是异步的,可以与async和await使用;

2、业务模型和通讯模型转换过程做了反射优化。

在相关项目工程在哪里

项目放在了github,https://github.com/xljiulang/LuceneServer

有什么建议可以在这里或github上提。

Lucene.Net的服务器封装+APi组件 (开源)的更多相关文章

  1. 封装Vue组件的一些技巧

    封装Vue组件的一些技巧 本文同步在个人博客shymean.com上,欢迎关注 写Vue有很长一段时间了,除了常规的业务开发之外,也应该思考和反思一下封装组件的正确方式.以弹窗组件为例,一种实现是在需 ...

  2. 收集整理的openstack java封装 api的第三方实现的选择

    Apache jclouds 地址:http://jclouds.apache.org/guides/openstack/ 一个开源库,java实现,支持cloudstack,openstack以及各 ...

  3. JS组件系列——自己动手封装bootstrap-treegrid组件

    前言:最近产品需要设计一套相对完整的组织架构的解决方案,由于组织架构涉及到层级关系,在表格里面展示层级关系,自然就要用到所谓的treegrid.可惜的是,一些轻量级的表格组件本身并没有自带树形表格的功 ...

  4. 封装bootstrap-treegrid组件

    封装bootstrap-treegrid组件   阅读目录 一.开源的treegrid 1.组件效果预览 2.组件开源地址 二.封装treegrid 1.组件封装的必要性 2.组件封装代码示例 3.封 ...

  5. 使用Vue CLI 3将基于element-ui二次封装的组件发布到npm

    前言:之前在网上找的好多都是基于vue-cli 2.x的,而使用vue-cli 3的文章比较少,Vue CLI 3 中文文档,所以我在自己尝试的时候把几篇文章结合了一下,调出来了我想要的模式,也就是V ...

  6. vue项目,封装api并使用

    封装api index.js let uploadBase = '' if(process.env.NODE_ENV === 'production'){ uploadBase = 'https:// ...

  7. SDK打开模拟器遇到SDK包里缺少API组件,附上我的解决历程,心累

    背景描述:之前一直用真机做自动化,突然被要求用模拟器,就开始准备环境,发现模拟器里少很多配置,前提:配置了Android环境变量,且配置了代理如下:大连东软信息学院镜像服务器地址:http://mir ...

  8. ReactNative: 自定义ReactNative API组件

    一.简介 在前面介绍了很多ReactNative中UI组件和API组件,这些都是Facebook团队封装好的基础组件,开发者可以直接使用.然而,在实际的开发过程中,面对复杂的需求,此时原生的Nativ ...

  9. jQuery MiniUI 开发指南+API组件参考手册

    jQuery MiniUI 开发指南 本文档将逐步的讲解jQuery MiniUI的方方面面,从此您将踏上jQuery MiniUI的深入探索之旅.                 1.Hello M ...

随机推荐

  1. ASP.NET MVC 监控诊断、本地化和缓存

    这篇博客主要是针对asp.net mvc项目的一些常用的东东做一个讲解,他们分别是监控诊断.本地化和缓存.虽然前两者跟asp.net mvc看上去好像是没什么关联. 但其实如果真正需要做asp.net ...

  2. MySQL 优化之 index merge(索引合并)

    深入理解 index merge 是使用索引进行优化的重要基础之一.理解了 index merge 技术,我们才知道应该如何在表上建立索引. 1. 为什么会有index merge 我们的 where ...

  3. mysqli,Fatal error

    <?php //mysql数据库类-mysqli版 //2014/6/13 class mysqlidb{ public $dbhost; public $dbuser; public $dbp ...

  4. if_nametoindex可以检查网卡名称是否有效

    NAME if_nametoindex, if_indextoname, if_nameindex, if_freenameindex - convert interface index to nam ...

  5. java 判断两个时间相差的天数

    1.实现目标 输入:两个日期 输出:两个日期相差的天数 2.代码实现 方法1: 通过Calendar类的日期比较.注意:这里需要考虑一下: 日期是跨年份的,如一个是2012年,一个是2015年的   ...

  6. GDB教程详解

    GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC ...

  7. Openxml入门---Openxm读取Excel数据

    Openxml读取Excel数据: 有些问题,如果当Cell 里面是 日期和浮点型的话,对应的Cell.DataType==Null,对应的时间会转换为一个浮点型,对于这块可以通过DateTime.F ...

  8. Flex布局教程及属性速查

    一.Flex布局介绍 伸缩盒模型(flexbox)是一个新的盒子模型,意为"弹性布局",用来为盒状模型提供最大的灵活性,主要优化了UI布局.Flexbox的功能主要包手:简单使用一 ...

  9. 渗透攻防工具篇-后渗透阶段的Meterpreter

    作者:坏蛋链接:https://zhuanlan.zhihu.com/p/23677530来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 前言 熟悉Metasploit ...

  10. input file美化,文件上传

    此文学习至:http://www.haorooms.com/post/input_file_leixing 然而只会用,不会做,UI泪茫茫 效果图: 原图: 美化后: 此主要用css美化表单,然后用J ...