zoukankan      html  css  js  c++  java
  • Lucene.Net的服务器封装+APi组件 (开源)

    为什么要封装

    真不知道用什么标题合适,我这几天在研究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, 100)
                    .OrderByDescending(item => item.OrderIndex)
                    .Skip(0)
                    .Take(10)
                    .ToList();
            }
    复制代码

    相关技术

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

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

    在相关项目工程在哪里

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

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

  • 相关阅读:
    centos x86_64--------------------------------系统调用
    通过tracing技术来教授操作系统
    Cobra —— 可视化Python虚拟机 and 图解python
    ArcGIS Engine中空间参照(地理坐标)相关方法总结
    ArcGIS Engine检索要素集、要素类和要素
    C#打开SDE数据库的几种方式总结
    ArcSDE:C#创建SDE要素数据集
    ORA-01653 无法在表空间扩展的解决办法 -- 增加表空间大小或给表空间增加数据文件
    3.第一个Node.js程序:Hello World!
    2.使用的版本
  • 原文地址:https://www.cnblogs.com/jjg0519/p/7111725.html
Copyright © 2011-2022 走看看