千家信息网

.Net Api中怎么使用Elasticsearch存储文档

发表于:2025-01-22 作者:千家信息网编辑
千家信息网最后更新 2025年01月22日,这篇文章主要介绍".Net Api中怎么使用Elasticsearch存储文档"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇".Net Api中怎么使用Elas
千家信息网最后更新 2025年01月22日.Net Api中怎么使用Elasticsearch存储文档

这篇文章主要介绍".Net Api中怎么使用Elasticsearch存储文档"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇".Net Api中怎么使用Elasticsearch存储文档"文章能帮助大家解决问题。

什么是Elasticsearch?

Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasticsearch 数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。

总之这个数据库可以很灵活的对你存入的数据进行分词并查询,可以灵活的处理字段内容,筛选你想要的数据,更重要的是这个数据库是分布式的,可以减少应为一个数据库down掉而导致的数据丢失。

以下简称Elasticsearch为Es数据库。前言 | Elasticsearch: 权威指南 | Elastic

用Nest使用Es数据库

配置Nest

在C# 的环境中,有一个Es的官方拓展包Nest,可以让我们方便快捷的使用上Es数据库。首先在我们新建完项目后,需要在Nuget包管理中给项目安装NEST包。

安装完NEST包之后,需要新建一个Es的配置类EsConfig.cs,这里我们只使用最简单的账号,密码和数据库地址

 ///     /// ES配置类    ///     public class EsConfig    {        ///         /// 账号        ///         public string username { get; set; }        ///         /// 密码        ///         public string password { get; set; }        ///         /// ES地址        ///         public string url { get; set; }    }

有了配置类之后,需要在程序启动时,对Es进行配置。首先这里先新建一个Es客户端的接口类IElasticsearchClient.cs

 ///     /// ES客户端    ///     public interface IElasticsearchClient    {        ///         /// 获取ElasticClient        ///         ///         ElasticClient GetClient();        ///         /// 指定index获取ElasticClient        ///         ///         ///         ElasticClient GetClient(string indexName);    }

在配置对该接口的实现类ElasticsearchClient.cs,在这个实现类中我们使用了IOptions的依赖注入的形式来对配置文件进行配置,这种模式通常适用于API类型项目的配置。

我们也可以使用直接_EsConfig = Configuration.GetSection("EsConfig").Get();的形式来读取配置文件进行配置

///     /// ES客户端    ///     public class ElasticsearchClient : IElasticsearchClient    {        public EsConfig _EsConfig;        ///         /// 构造函数        ///         ///         public ElasticsearchClient(IOptions esConfig)        {            _EsConfig = esConfig.Value;        }        ///         /// 获取elastic client        ///         ///         public ElasticClient GetClient()        {            if (_EsConfig == null || _EsConfig.url == null || _EsConfig.url == "")            {                throw new Exception("urls can not be null");            }            return GetClient(_EsConfig.url, "");        }        ///         /// 指定index获取ElasticClient        ///         ///         ///         public ElasticClient GetClient(string indexName)        {            if (_EsConfig == null || _EsConfig.url == null || _EsConfig.url == "")            {                throw new Exception("urls can not be null");            }            return GetClient(_EsConfig.url, indexName);        }        ///         /// 根据url获取ElasticClient        ///         ///         ///         ///         private ElasticClient GetClient(string url, string defaultIndex = "")        {            if (string.IsNullOrWhiteSpace(url))            {                throw new Exception("urls can not be null");            }            var uri = new Uri(url);            var connectionSetting = new ConnectionSettings(uri);            if (!string.IsNullOrWhiteSpace(url))            {                connectionSetting.DefaultIndex(defaultIndex);            }            connectionSetting.BasicAuthentication(_EsConfig.username, _EsConfig.password); //设置账号密码            return new ElasticClient(connectionSetting);        }        ///         /// 根据urls获取ElasticClient        ///         ///         ///         ///         private ElasticClient GetClient(string[] urls, string defaultIndex = "")        {            if (urls == null || urls.Length < 1)            {                throw new Exception("urls can not be null");            }            var uris = urls.Select(p => new Uri(p)).ToArray();            var connectionPool = new SniffingConnectionPool(uris);            var connectionSetting = new ConnectionSettings(connectionPool);            if (!string.IsNullOrWhiteSpace(defaultIndex))            {                connectionSetting.DefaultIndex(defaultIndex);            }            return new ElasticClient(connectionSetting);        }    }

既然是依赖注入别忘了在Startup.cs中对其进行注入。

services.Configure(Configuration.GetSection("EsConfig"));

操作数据库

平时在我们操作数据库之前,我们通常会有一个"建库"、"建表"等操作,在Es中我们可以理解为创建索引基础入门 | Elasticsearch: 权威指南 | Elastic。

由于Es数据库目前还没有很好的IDE去管理它,我们通常使用代码来实现表的创建,所以先新建一个Es的拓展类来创建表ElasticClientExtension.cs

 ///     /// ElasticClient 扩展类    ///     public static class ElasticClientExtension    {        ///         /// 创建索引        ///         ///         ///         ///         ///         ///         ///         public static bool CreateIndex(this ElasticClient elasticClient, string indexName = "", int numberOfShards = 10, int numberOfReplicas = 1) where T : class        {            if (string.IsNullOrWhiteSpace(indexName))            {                indexName = typeof(T).Name;            }            if (elasticClient.Indices.Exists(indexName).Exists)            {                return false;            }            else            {                var indexState = new IndexState()                {                    Settings = new IndexSettings()                    {                        NumberOfReplicas = numberOfReplicas,                        NumberOfShards = numberOfShards,                    },                };                var response = elasticClient.Indices.Create(indexName, p => p.InitializeUsing(indexState).Map(p => p.AutoMap()));                return response.Acknowledged;            }        }    }

然后就是需要创建我们针对索引的方法了,我使用的是一个索引新建一个方法,新建一个ElaticSearchBase.cs,在这里我们假设要创建一个叫XXX的索引,首先我们要定义好一个叫XXX的类,我这里新建了一个主键和一个xml字段,用来存储xml的数据。然后我在ElaticSearchBase.cs新建一个专属于连接XXX索引的客户端Client_XXX,如果数据库中存在xxx则直接连接,如果不存在则新建后连接。

  public class XXX    {        public int xid { get; set; }        [Text(Name = "xml")]        public string xml { get; set; }    }
  public class ElaticSearchBase    {        private IElasticsearchClient _client;        public ElaticSearchBase(IElasticsearchClient client)        {            _client = client;        }        ///         /// XXX文档索引        ///         public ElasticClient Client_XXX => GetXXX();        private ElasticClient GetXXX()        {            //如果数据库中存在xxx则直接连接,如果不存在则新建后连接            var client = _client.GetClient("XXX");            if (!client.Indices.Exists("XXX").Exists)            {                client.CreateIndex("XXX");            }            return client;        }    }

接下来我们到了实操部分:

新增

private ElaticSearchBase _es = new ElaticSearchBase(_client);//实例化对象var xxx1 = new XXX(){tempid = 1,xml = "xmlstring"};//存储xxx1var res =_es.Client_XXX.IndexDocument(xxx1);//获得Es主键var esid = res.Id;

查询

var res = _es.Client_XXX.Get(esid);

删除

var res = _es.Client_XXX.Delete(esid)

修改

//实例化对象var xxx2 = new XXX(){tempid = 2,xml = "xmlstring2"};var upRes= _es.Client_XXX.Update(ex.xmlid, upt => upt.Doc(xxx2));

关于".Net Api中怎么使用Elasticsearch存储文档"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

0