ES 服务器 索引、类型仓库基类 BaseESStorage

/*******************************************************
 *
 * 作者:朱皖苏
 * 创建日期:20180508
 * 说明:此文件只包含一个类,具体内容见类型注释。
 * 运行环境:.NET 4.0
 * 版本号:1.0.0
 *
 * 历史记录:
 * 创建文件 朱皖苏 20180508 14:00
 *
*******************************************************/

using DBEN.Basic.ElasticSearch;
using Elasticsearch.Net;
using Nest;
using System;
using System.Collections.Generic;
using System.Linq;

namespace DBEN.ITEngine.Storages
{
    /// <summary>
    /// ES 服务器 索引、类型仓库基类
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public abstract class BaseESStorage<T> where T : class, IESEntity
    {
        protected ElasticClient client;

        protected string index = string.Empty;
        protected string type = nameof(T).ToLower();

        /// <summary>
        /// 默认的初始化 client
        /// </summary>
        /// <param name="nodes">服务器集群</param>
        /// <param name="index">索引名</param>
        protected virtual void InitClient(IEnumerable<Uri> nodes, string index)
        {
            var pool = new StaticConnectionPool(nodes);

            var settings = new ConnectionSettings(pool);
            settings.DefaultIndex(index);
            settings.DisableDirectStreaming(true);
            client = new ElasticClient(settings.ThrowExceptions());
            var exits = client.IndexExists(index);

            if (!exits.Exists)
            {
                CreateIndex(index + "_real", index);
            }
            this.index = index;
        }

        /// <summary>
        /// 当索引不存在的时候创建索引。
        /// 根据 <see cref="Nest.ElasticsearchTypeAttribute"/> 自动映射类型
        /// 默认创建 NumberOfShards = 5
        /// 默认创建 NumberOfReplicas = 1,
        /// </summary>
        /// <param name="index"></param>
        protected virtual void CreateIndex(string index, string Alias)
        {
            var descriptor = new CreateIndexDescriptor(index)
                .Settings(s =>
                s.NumberOfShards(5).NumberOfReplicas(1))
                .Aliases(m => m.Alias(Alias))
                .Mappings(ms => ms.Map<T>(m => m
                .Properties(ps => ps
                   .Text(t => t.Name(n => n.Id))
                   .Text(t => t.Name(n => n.CreateTime).Index(true)))
                .AutoMap()));

            client.CreateIndex(descriptor);

        }

        /// <summary>
        /// 新增单条信息
        /// </summary>
        /// <param name="entity">数据实体</param>
        public bool InsertOne(T t)
        {
            if (!string.IsNullOrEmpty(t.Id))
            {
                return false;
            }
            var rsp = client.Index(t, o => o.Index(index).Id(t.Id));
            t.Id = rsp.Id;
            return rsp.ApiCall.Success;
        }

        /// <summary>
        /// 新增多条信息
        /// </summary>
        /// <param name="entity">数据实体</param>
        public void InsertMany(IEnumerable<T> t)
        {
            var rsp = client.IndexMany(t, index);
        }

        /// <summary>
        /// 更新单条信息
        /// </summary>
        /// <param name="t"></param>
        /// <param name="id"></param>
        public void UpdateOne(T t, Id id)
        {
            var rsp = client.Index<T>(t, o => o.Index(index).Id(id));
        }

        /// <summary>
        /// (根据名称精确查找)
        /// </summary>
        /// <param name="t"></param>
        /// <param name="field"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public ISearchResponse<T> Find(string field, string value)
        {
            var searchResult = client.Search<T>(s => s
                                   .Index(index)
                                   .Query(q => q
                   .Term(e => e.Suffix(field), value)));
            return searchResult;
        }

        /// <summary>
        /// 根据名称精确查找一个
        /// </summary>
        /// <param name="field"></param>
        /// <param name="value"></param>
        /// <param name="compare"></param>
        /// <returns></returns>
        public T FindFirst(string field, string value, Func<T, bool> compare = null)
        {
            var searchResult = client.Search<T>(s => s
                                   .Index(index)
                                   .Query(q => q
                   .Term(e => e.Suffix(field), value)));
            return searchResult.Hits.Select(m => m.Source)
                .FirstOrDefault(m => compare == null ? true : compare.Invoke(m));
        }

        /// <summary>
        /// 模糊查询
        /// </summary>
        /// <param name="field"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public ISearchResponse<T> FuzzyFind(string field, string value)
        {
            //模糊搜索
            var searchResult = client.Search<T>(s => s
                     .Index(index)
                     .From(0)
                     .Size(10)
                     .Query(q => q
                         .MatchPhrase(d => d.Field(field).Query(value).Slop(100))));
            return searchResult;
        }

        /// <summary>
        /// term any item of <paramref name="values"/>
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="descriptor"></param>
        /// <param name="field"></param>
        /// <param name="values"></param>
        /// <returns></returns>
        protected QueryContainer TermAny(QueryContainerDescriptor<T> descriptor, Field field, IEnumerable<string> values)
        {
            QueryContainer q = new QueryContainer();
            foreach (var value in values)
            {
                q |= descriptor.Term(t => t.Field(field).Value(value));
            }
            return q;
        }

        public long Count()
        {
            return client.Count<T>(s => s.Index(index)).Count;
        }
    }
}

ENtity

using Nest;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DBEN.Basic.ElasticSearch
{

    public interface IESEntity
    {
        string Id { get; set; }

        DateTime CreateTime { get; set; }
    }
}

原文地址:https://www.cnblogs.com/zhuwansu/p/10836898.html

时间: 2024-10-19 14:37:20

ES 服务器 索引、类型仓库基类 BaseESStorage的相关文章

.NET基础 (11)类型的基类System.Object

类型的基类System.Object1 是否存在不继承自System.Object类型的类2 在System.Object中定义的三个比较方法有何异同3 如何重写GetHashCode方法 类型的基类System.Object1 是否存在不继承自System.Object类型的类 通过运行ILasm.exe的noautoinherit开关,可以生产不从System.Object继承的类型,这种类型是不安全的类型,也不建议使用. 2 在System.Object中定义的三个比较方法有何异同 静态方

(C++)浅谈多态基类析构函数声明为虚函数

主要内容: 1.C++类继承中的构造函数和析构函数 2.C++多态性中的静态绑定和动态绑定 3.C++多态性中析构函数声明为虚函数 1.C++类继承中的构造函数和析构函数 在C++的类继承中, 建立对象时,首先调用基类的构造函数,然后在调用下一个派生类的构造函数,依次类推: 析构对象时,其顺序正好与构造相反: 具体参考文章:http://www.cnblogs.com/AndyJee/p/4575385.html 2.C++多态性中的静态绑定和动态绑定 对象的静态类型:对象在声明是采用的类型,在

System.Object 基类

System.Object 基类 System.Object在.Net中是所有类型的基类,任何类型都直接或间接地继承自System.Object.没有指定基类的类型都默认继承于System.Object. 基类特性 正由于所有的类型都继承于System.Object.因此,所有的类型都具有下面这些特性: GetType()方法,获取对象的类型. Equals.ReferenceEquals和==,判断对象是否相等. ToString()方法,获取对象的字符串信息,默认返回对象带命名空间的全名.

枚举基类Enum详解

本文主要是对枚举类型的基类Enum类做一个介绍: 首先,Enum类位于java.lang包下,根据类的介绍可以发现,Enum类是Java中所有枚举类的父类,将枚举作为一个set或者Map的keys来使用具有很高的效率. Enum类是一个抽象类,实现了Comparable和Serializable接口,在类中只有两个成员变量name和ordinal,分别表示枚举的名字和序号均为private,但是提供了两个方法来返回这两个字段分别是name()和ordinal(); Enum类提供一个为一个构造方

C++中基类的析构函数为什么要用virtual虚析构函数

知识背景 要弄明白这个问题,首先要了解下C++中的动态绑定. 关于动态绑定的讲解,请参阅:  C++中的动态类型与动态绑定.虚函数.多态实现 正题 直接的讲,C++中基类采用virtual虚析构函数是为了防止内存泄漏.具体地说,如果派生类中申请了内存空间,并在其析构函数中对这些内存空间进行释放.假设基类中采用的是非虚析构函数,当删除基类指针指向的派生类对象时就不会触发动态绑定,因而只会调用基类的析构函数,而不会调用派生类的析构函数.那么在这种情况下,派生类中申请的空间就得不到释放从而产生内存泄漏

C++中基类虚析构函数的作用及其原理分析

虚析构函数的理论前提是 执行完子类的析构函数,那么父类的虚构函数必然会被执行. 那么当用delete释放一个父类指针所实例化的子类对象时,如果没有定义虚析构函数,那么将只会调用父类的析构函数,而不会调用子类的虚构函数,导致内存的泄漏. 故: 继承时,要养成的一个好习惯就是,基类析构函数中,加上virtual. 知识背景 要弄明白这个问题,首先要了解下C++中的动态绑定. 关于动态绑定的讲解,请参阅:  C++中的动态类型与动态绑定.虚函数.多态实现 正题 直接的讲,C++中基类采用virtual

OOP1(定义基类和派生类)

面向对象程序设计基于三个基本概念:数据抽象,继承和动态绑定 数据抽象是一种依赖于接口和实现分离的编程技术.继承和动态绑定对程序的编号有两方面的影响:一是我们可以更容易地定义与其它类相似但不完全相同的类:二是在使用这些彼此相似的类编写程序时,我们可以在一定程度上忽略掉它们的区别. 在 c++ 语言中,当我们使用基类的引用或指针调用一个虚函数时将发生动态绑定 定义基类: 1 class Quote { 2 public: 3 Quote() = default; 4 Quote(const std:

基类的析构函数写成virtual虚析构函数

虚函数作用:动态绑定,实现多态效果. 场景问题: 派生类中有资源需要回收,而在编程中采用多态,由基类的指针指向派生类,则在释放的时候,如果基类的析构函数不是virtual,则派生类的析构函数得不到释放 总结: C++中基类采用virtual虚析构函数是为了防止内存泄漏.具体地说,如果派生类中申请了内存空间,并在其析构函数中对这些内存空间进行释放.假设基类中采用的是非虚析构函数,当删除基类指针指向的派生类对象时就不会触发动态绑定,因而只会调用基类的析构函数,而不会调用派生类的析构函数.那么在这种情

C++-基类的析构函数为什么要加virtual虚析构函数(转)

知识背景 要弄明白这个问题,首先要了解下C++中的动态绑定. 关于动态绑定的讲解,请参阅:  C++中的动态类型与动态绑定.虚函数.多态实现 正题 直接的讲,C++中基类采用virtual虚析构函数是为了防止内存泄漏.具体地说,如果派生类中申请了内存空间,并在其析构函数中对这些内存空间进行释放.假设基类中采用的是非虚析构函数,当删除基类指针指向的派生类对象时就不会触发动态绑定,因而只会调用基类的析构函数,而不会调用派生类的析构函数.那么在这种情况下,派生类中申请的空间就得不到释放从而产生内存泄漏