/*******************************************************
*
* 作者:朱皖苏
* 创建日期: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().NumberOfReplicas())
.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()
.Size()
.Query(q => q
.MatchPhrase(d => d.Field(field).Query(value).Slop())));
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; }
}
}

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

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

    类型的基类System.Object1 是否存在不继承自System.Object类型的类2 在System.Object中定义的三个比较方法有何异同3 如何重写GetHashCode方法 类型的基类 ...

  2. C# System.Object基类

    System.Object 基类 System.Object在.Net中是所有类型的基类,任何类型都直接或间接地继承自System.Object.没有指定基类的类型都默认继承于System.Objec ...

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

    知识背景 要弄明白这个问题,首先要了解下C++中的动态绑定. 关于动态绑定的讲解,请参阅:  C++中的动态类型与动态绑定.虚函数.多态实现 正题 直接的讲,C++中基类采用virtual虚析构函数是 ...

  4. 枚举基类Enum详解

    本文主要是对枚举类型的基类Enum类做一个介绍: 首先,Enum类位于java.lang包下,根据类的介绍可以发现,Enum类是Java中所有枚举类的父类,将枚举作为一个set或者Map的keys来使 ...

  5. “每日一道面试题”.Net中所有类的基类是以及包含的方法

    闲来无事,每日一贴.水平有限,大牛勿喷. .Net中所有内建类型的基类是System.Object毋庸置疑 Puclic Class A{}和 Public Class A:System.Object ...

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

    虚函数作用:动态绑定,实现多态效果. 场景问题: 派生类中有资源需要回收,而在编程中采用多态,由基类的指针指向派生类,则在释放的时候,如果基类的析构函数不是virtual,则派生类的析构函数得不到释放 ...

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

    虚析构函数的理论前提是 执行完子类的析构函数,那么父类的虚构函数必然会被执行. 那么当用delete释放一个父类指针所实例化的子类对象时,如果没有定义虚析构函数,那么将只会调用父类的析构函数,而不会调 ...

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

    主要内容: 1.C++类继承中的构造函数和析构函数 2.C++多态性中的静态绑定和动态绑定 3.C++多态性中析构函数声明为虚函数 1.C++类继承中的构造函数和析构函数 在C++的类继承中, 建立对 ...

  9. System.Object 基类

    System.Object在.Net中是所有类型的基类,任何类型都直接或间接地继承自System.Object.没有指定基类的类型都默认继承于System.Object. 基类特性 正由于所有的类型都 ...

随机推荐

  1. 【知识小结】Git 个人学习笔记及心得

    https://mp.weixin.qq.com/s/D96dXYfu3XAA4ac456qo0g git架构 工作区:就是你在电脑里能看到的目录. 版本库:工作区有一个隐藏目录.git,,而是Git ...

  2. 教你怎么让vi和vim显示行数

    首先我们来看看没有行号是多么难看. 2 再来看看有行号后的效果. 3 设置行号很简单. 我们要到命令模式下,输入set number :set number 按下回车 来看看效果 4 那么怎么关闭行号 ...

  3. Python--day48--ORM框架SQLAlchemy

    SQLAlchemy: SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执 ...

  4. Codeforces Round #179 (Div. 1 + Div. 2)

    A. Yaroslav and Permutations 值相同的个数不能超过\(\lfloor \frac{n + 1}{2} \rfloor\). B. Yaroslav and Two Stri ...

  5. joinColumns和inverseJoinColumns的用法

    最近在工作中使用springside,里面用到了hibernate的多对多 一开始我在配置department(部门表)和menu(栏目表)的时候,这样写的. Department实体类中的getMe ...

  6. vue组件中data是个函数

    当我们const vm = new Vue({ el : '#app',   data : { msg:‘hello World’ } })用习惯了,data是一个对象,可到了vue组件 Vue.co ...

  7. UVA 247"Calling Circles"(floyd求传递闭包+SCC)

    传送门 题意: 如果两个人相互打电话(直接或间接),则说他们在同一个电话圈里. (a,b) 表示 a 打给 b: 例如,(a,b),(b,c),(c,d),(d,a),则这四个人在同一个电话圈里: 输 ...

  8. tomcat下的work目录和temp目录

    1. tomcat下的work目录 1    用tomcat作web服务器的时候,部署的程序在webApps下,这些程序都是编译后的程序(发布到tomcat的项目里含的类,会被编译成.class后才发 ...

  9. flex布局简单兼容性写法

    /* 定义 */ .flex-def { display: -webkit-box; /* 老版本语法: Safari, iOS, Android browser, older WebKit brow ...

  10. 2018-2-13-手机1520-win8.1升级win10

    title author date CreateTime categories 手机1520 win8.1升级win10 lindexi 2018-2-13 17:23:3 +0800 2018-2- ...