.Net Core3.1 MVC + EF Core+ AutoFac+LayUI+Sqlserver的框架搭建ElasticSearch

    ES数据库配置和搭建以前也已经写过了,感兴趣的可以看我以前写的。现在我就是直接把它集成到我的架构中了。就是在以前的基础上又做了封装。

   ES数据库索引的创建和数据的插入类,单节点模式:

using Nest;
using System;
using System.Collections.Generic;
using System.Text;

namespace Core.Net.Common.Core.Net.Core.ES
{
    /// <summary>
    /// ES数据库连接和创建索引,插入数据
    /// </summary>
    /// <typeparam name="T"></typeparam>
  public  class ESHelper<T> where T:class
    {
        public static readonly string url = "http://ip:port/";
        /// <summary>
        /// 批量插入
        /// </summary>
        /// <param name="obj">出入的数据</param>
        /// <param name="index">索引</param>
        public static void ManyInsert(List<T> obj, string index)
        {
            //设置连接字符串,DefaultIndex中的表名要小写
            var settings = new ConnectionSettings(new Uri(url)).DefaultIndex(index);
            var client = new ElasticClient(settings);
            try
            {
                var ndexResponse = client.IndexMany<T>(obj);
                Core.FileHelper.AddLog("插入ES数据库成功" + ndexResponse.ToString(), "Log");
            }
            catch (Exception e)
            {

                Core.FileHelper.AddLog("插入ES数据库异常" + e.ToString(), "Log");
            }

        }
        /// <summary>
        /// 单行插入
        /// </summary>
        /// <param name="t">插入的数据</param>
        /// <param name="index">索引</param>
        public static void insert(object t, string index)
        {
            //设置连接字符串,DefaultIndex中的表名要小写
            var settings = new ConnectionSettings(new Uri(url)).DefaultIndex(index);
            var client = new ElasticClient(settings);
            //  client.IndexMany<>
            var doc = t;
            //通过 IndexDocument() 方法插入数据
            var ndexResponse = client.IndexDocument(doc);
        }
        /// <summary>
        /// 连接ES
        /// </summary>
        /// <param name="index">索引</param>
        /// <returns></returns>
        public static ElasticClient Connect_Index(string index)
        {

            //设置连接字符串,DefaultIndex中的表名要小写
            var settings = new ConnectionSettings(new Uri(url)).DefaultIndex(index);
            var client = new ElasticClient(settings);
            return client;

        }
    }
}

多节点模式:

using Elasticsearch.Net;
using Nest;
using System;
using System.Collections.Generic;
using System.Text;

namespace Core.Net.Common.Core.Net.Core.ES
{
    /// <summary>
    /// 步骤ES集群或者创建索引分片的时候可以用
    /// </summary>
   public static class ESManyHelper
    {
        /// <summary>
        /// 单点链接到ElasticSearch
        /// </summary>
        /// <param name="url">ElasticSearch的ip地址</param>
        /// <returns></returns>
        public static  ElasticClient OneConnectES(string url)
        {

            var node = new Uri(url);
            var settings = new ConnectionSettings(node);
            var client = new ElasticClient(settings);
            return client;
        }
        /// <summary>
        /// 指定多个节点使用连接池链接到Elasticsearch集群
        /// </summary>
        /// <param name="serverurl">链接ip数组</param>
        /// <returns></returns>
        public static ElasticClient ManyConnectES(string[] serverurl)
        {
            Uri[] nodes = new Uri[serverurl.Length];
            for (int i = 0; i < serverurl.Length; i++)
            {
                nodes[i] = new Uri(serverurl[i]);
            }
            var pool = new StaticConnectionPool(nodes);
            var settings = new ConnectionSettings(pool);
            var client = new ElasticClient(settings);
            return client;
        }
        /// <summary>
        /// 创建索引
        /// </summary>
        /// <param name="elasticClient"></param>
        public static  CreateIndexResponse CreateIndex(this IElasticClient elasticClient, string indexName, int numberOfReplicas = 1, int numberOfShards = 5)
        {
            IIndexState indexState = new IndexState
            {
                Settings = new IndexSettings
                {
                    NumberOfReplicas = numberOfReplicas,
                    // [副本数量]
                    NumberOfShards = numberOfShards
                }
            };
            Func<CreateIndexDescriptor, ICreateIndexRequest> func = x => x.InitializeUsing(indexState).Map(m => m.AutoMap());
            CreateIndexResponse response = elasticClient.Indices.Create(indexName, func);
            return response;
        }
    }
}

ES数据库查询类封装:

using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Text;

namespace Core.Net.Common.Core.Net.Core.ES
{
        /// <summary>
    /// ES数据库查询通用类
    /// </summary>
    /// <typeparam name="T"></typeparam>
   public class ESSearchHelper<T> where T:class,new()
    {
        /// <summary>
        /// 带有一个查询条件的查询
        /// </summary>
        /// <param name="index">ES数据库索引</param>
        /// <param name="onewhere">查询条件表达式</param>
        /// <param name="onefiled">查询条件字段</param>
        /// <param name="orderby">排序</param>
        /// <param name="startPage">开始页</param>
        /// <param name="endPage">结束页</param>
        /// <returns></returns>
        public static List<T> GetOneESList(string index, Expression<Func<T, bool>> onewhere,string onefiled, Expression<Func<T, bool>> orderby,int startPage,int endPage)
        {
            var client = ESHelper<T>.Connect_Index(index);
            var result = client.Search<T>
                (
                    x => x.Index(index)
                    .Query(q => q.Match(m => m.Field(onewhere).Query(onefiled)))
                    .Sort(q=>q.Descending(orderby))
                    .From(startPage)
                    .Size(endPage)
                ).Documents.ToJson();
            return result.ToList<T>();
        }
        /// <summary>
        /// 带有两个查询条件的查询
        /// </summary>
        /// <param name="index">ES数据库索引</param>
        /// <param name="onewhere">第一个查询条件表达式</param>
        /// <param name="onefiled">第一个查询条件字段</param>
        /// <param name="twowhere">第二个查询条件表达式</param>
        /// <param name="twofiled">第二个查询条件字段</param>
        /// <param name="orderby">排序</param>
        /// <param name="startPage">开始页数</param>
        /// <param name="endPage">结束页数</param>
        /// <returns></returns>
        public static List<T> GetTwoESList(string index, Expression<Func<T, bool>> onewhere, string onefiled, Expression<Func<T, bool>> twowhere,string twofiled, Expression<Func<T, bool>> orderby, int startPage, int endPage)
        {
            var client = ESHelper<T>.Connect_Index(index);
            var result = client.Search<T>
                (
                    x => x.Index(index)
                    .Query(q => q.Match(m => m.Field(onewhere).Query(onefiled)))
                    .Query(q => q.Match(m => m.Field(twowhere).Query(twofiled)))
                    .Sort(q => q.Descending(orderby))
                    .From(startPage)
                    .Size(endPage)
                ).Documents.ToJson();
            return result.ToList<T>();
        }
        /// <summary>
        /// 三个查询条件查询ES数据库
        /// </summary>
        /// <param name="index">ES数据库索引</param>
        /// <param name="onewhere">第一个查询条件表达式</param>
        /// <param name="onefiled">第一个查询条件字段</param>
        /// <param name="twowhere">第二个查询条件表达式</param>
        /// <param name="twofiled">第二个查询条件字段</param>
        /// <param name="threewhere">第三个查询条件表达式</param>
        /// <param name="threefiled">第三个查询条件字段</param>
        /// <param name="orderby">排序</param>
        /// <param name="startPage">开始页数</param>
        /// <param name="endPage">结束页数</param>
        /// <returns></returns>
        public static List<T> GetThreeESList(string index, Expression<Func<T, bool>> onewhere, string onefiled, Expression<Func<T, bool>> twowhere, string twofiled, Expression<Func<T, bool>> threewhere, string threefiled, Expression<Func<T, bool>> orderby, int startPage, int endPage)
        {
            var client = ESHelper<T>.Connect_Index(index);
            var result = client.Search<T>
                (
                    x => x.Index(index)
                    .Query(q => q.Match(m => m.Field(onewhere).Query(onefiled)))
                    .Query(q => q.Match(m => m.Field(twowhere).Query(twofiled)))
                    .Query(q => q.Match(m => m.Field(threefiled).Query(threefiled)))
                    .Sort(q => q.Descending(orderby))
                    .From(startPage)
                    .Size(endPage)
                ).Documents.ToJson();
            return result.ToList<T>();
        }    
        /// <summary>
        /// 除时间外含有一个查询条件
        /// </summary>
        /// <param name="index">ES数据库索引</param>
        /// <param name="onewhere">查询条件表达式</param>
        /// <param name="onefiled">查询条件字段</param>
        /// <param name="timewhere">时间字段表达式</param>
        /// <param name="startTime">开始时间</param>
        /// <param name="endTime">结束时间</param>
        /// <param name="orderby">排序</param>
        /// <param name="startPage">开始页</param>
        /// <param name="endPage">结束页</param>
        /// <returns></returns>
        public static List<T> GetOneTimeESList(string index, Expression<Func<T, bool>> onewhere, string onefiled, Expression<Func<T, bool>> timewhere,DateTime startTime,DateTime endTime, Expression<Func<T, bool>> orderby, int startPage, int endPage)
        {
            var client = ESHelper<T>.Connect_Index(index);
            var result = client.Search<T>
                (
                    x => x.Index(index)
                    .Query(q => q.Match(m => m.Field(onewhere).Query(onefiled)))
                    //注意:这个按时间段查询我试了好多此,好像只要添加这个时间段,就查不出来任何数据,非常奇怪,我百度了一下,好像都是这样干的。
                    .Query(q=>q.DateRange(c=>c.Field(timewhere).LessThanOrEquals(startTime).GreaterThanOrEquals(endTime)))
                    .Sort(q => q.Descending(orderby))
                    .From(startPage)
                    .Size(endPage)
                ).Documents.ToJson();
            return result.ToList<T>();
        }
        /// <summary>
        /// 除时间外含有一个查询条件
        /// </summary>
        /// <param name="index">ES数据库索引</param>
        /// <param name="onewhere">第一个查询条件表达式</param>
        /// <param name="onefiled">第一个查询条件字段</param>
        /// <param name="twowhere">第二个查询条件表达式</param>
        /// <param name="twofiled">第二个查询条件字段</param>
        /// <param name="timewhere">时间字段表达式</param>
        /// <param name="startTime">开始时间</param>
        /// <param name="endTime">结束时间</param>
        /// <param name="orderby">排序</param>
        /// <param name="startPage">开始页</param>
        /// <param name="endPage">结束页</param>
        /// <returns></returns>
        public static List<T> GetTwoTimeESList(string index, Expression<Func<T, bool>> onewhere, string onefiled, Expression<Func<T, bool>> twowhere, string twofiled, Expression<Func<T, bool>> timewhere, DateTime startTime, DateTime endTime, Expression<Func<T, bool>> orderby, int startPage, int endPage)
        {
            var client = ESHelper<T>.Connect_Index(index);
            var result = client.Search<T>
                (
                    x => x.Index(index)
                    .Query(q => q.Match(m => m.Field(onewhere).Query(onefiled)))
                    .Query(q => q.Match(m => m.Field(twowhere).Query(twofiled)))
                    .Query(q => q.DateRange(c => c.Field(timewhere).LessThanOrEquals(startTime).GreaterThanOrEquals(endTime)))
                    .Sort(q => q.Descending(orderby))
                    .From(startPage)
                    .Size(endPage)
                ).Documents.ToJson();
            return result.ToList<T>();
        }
        /// <summary>
        /// 除时间外含有一个查询条件
        /// </summary>
        /// <param name="index">ES数据库索引</param>
        /// <param name="onewhere">第一个查询条件表达式</param>
        /// <param name="onefiled">第一个查询条件字段</param>
        /// <param name="twowhere">第二个查询条件表达式</param>
        /// <param name="twofiled">第二个查询条件字段</param>
        /// <param name="threewhere">第三个查询条件表达式</param>
        /// <param name="threefiled">第三个查询条件字段</param>
        /// <param name="timewhere">时间字段表达式</param>
        /// <param name="startTime">开始时间</param>
        /// <param name="endTime">结束时间</param>
        /// <param name="orderby">排序</param>
        /// <param name="startPage">开始页</param>
        /// <param name="endPage">结束页</param>
        /// <returns></returns>
        public static List<T> GetThreeTimeESList(string index, Expression<Func<T, bool>> onewhere, string onefiled, Expression<Func<T, bool>> twowhere, string twofiled, Expression<Func<T, bool>> timewhere, DateTime startTime, DateTime endTime, Expression<Func<T, bool>> threewhere, string threefiled, Expression<Func<T, bool>> orderby, int startPage, int endPage)
        {
            var client = ESHelper<T>.Connect_Index(index);
            var result = client.Search<T>
                (
                    x => x.Index(index)
                    .Query(q => q.Match(m => m.Field(onewhere).Query(onefiled)))
                    .Query(q => q.Match(m => m.Field(twowhere).Query(twofiled)))
                    .Query(q => q.Match(m => m.Field(threefiled).Query(threefiled)))
                    .Query(q => q.DateRange(c => c.Field(timewhere).LessThanOrEquals(startTime).GreaterThanOrEquals(endTime)))
                    .Sort(q => q.Descending(orderby))
                    .From(startPage)
                    .Size(endPage)
                ).Documents.ToJson();
            return result.ToList<T>();
        }
    }
}
.Net Core
原文地址:https://www.cnblogs.com/zpy1993-09/p/15548267.html