为什么要封装

真不知道用什么标题合适,我这几天在研究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. MySQL 中隔离级别 RC 与 RR 的区别

    1. 数据库事务ACID特性 数据库事务的4个特性: 原子性(Atomic): 事务中的多个操作,不可分割,要么都成功,要么都失败: All or Nothing. 一致性(Consistency): ...

  2. pl/sql developer——instant-client 简单配置

    instant-client(数据库即时客户端) 官方说明:即时客户端在一个单独的针对 Instant Client 的 OTN 开发和分发许可下提供,它允许大多数许可下载.重新分发和部署到生产环境中 ...

  3. 在win10中创建开机自动登陆的网络驱动器

    前提环境: win10系统电脑一台. centos系统电脑一台,在该系统中安装samba,并配置共享. 要解决的问题: 在win10做了网络映射,将centos共享的文件夹设置成本地硬盘.在映射时,也 ...

  4. Eclipse RCP实用小技巧

    1.插件Plugin工程的build.properties中增加一行,javacDefaultEncoding.. = UTF 2.插件Plugin工程的Runtime的classpath中加入.

  5. var 0bj = []声明报错的小问题

    闲来无事,找了份javascript的习题来作作,结果第一题的答案就难住了,附原题: Javascript中, 以下哪条语句一定会产生运行错误?      答案(  B   ) A.var _变量=N ...

  6. Use getopt() & getopt_long() to Parse Arguments

    Today I came across a function [getopt] by accident. It is very useful to parse command-line argumen ...

  7. cuda中thread id

    //////////////////////////////////////////////////////////////////////////// // // Copyright 1993-20 ...

  8. 2016年秋季的我,work with hololens

  9. 当手机被PS掉,人们看到的是手中的灵魂

    Eric Pickersgill是一名摄影师,最近喜欢拍摄并记录人们使用智能手机的情景,不过不同的是,在最终作品中会将手机从人们手中PS掉,一刹那会进入一个奇怪的世界.黑白照片也极具冲击力. 每个人神 ...

  10. JIRA学习一:Windows下安装破解JIRA6.3.6

    安装环境: WindowsXP MySQL-5.5.28 JDK1.6.0_21 JIRA功能全面,界面友好,安装简单,配置灵活,权限管理以及可扩展性方面都十分出色. 一.MySQL建库和建账号 1. ...