我的编程空间,编程开发者的网络收藏夹
学习永远不晚

.Net Api 中使用Elasticsearch存储文档的方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

.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,这里我们只使用最简单的账号,密码和数据库地址

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

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

 /// <summary>
    /// ES客户端
    /// </summary>
    public interface IElasticsearchClient
    {
        /// <summary>
        /// 获取ElasticClient
        /// </summary>
        /// <returns></returns>
        ElasticClient GetClient();
        /// <summary>
        /// 指定index获取ElasticClient
        /// </summary>
        /// <param name="indexName"></param>
        /// <returns></returns>
        ElasticClient GetClient(string indexName);
    }

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

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

/// <summary>
    /// ES客户端
    /// </summary>
    public class ElasticsearchClient : IElasticsearchClient
    {
        public EsConfig _EsConfig;
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="esConfig"></param>
        public ElasticsearchClient(IOptions<EsConfig> esConfig)
        {
            _EsConfig = esConfig.Value;
        }
        /// <summary>
        /// 获取elastic client
        /// </summary>
        /// <returns></returns>
        public ElasticClient GetClient()
        {
            if (_EsConfig == null || _EsConfig.url == null || _EsConfig.url == "")
            {
                throw new Exception("urls can not be null");
            }
            return GetClient(_EsConfig.url, "");
        }
        /// <summary>
        /// 指定index获取ElasticClient
        /// </summary>
        /// <param name="indexName"></param>
        /// <returns></returns>
        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);
        }
        /// <summary>
        /// 根据url获取ElasticClient
        /// </summary>
        /// <param name="url"></param>
        /// <param name="defaultIndex"></param>
        /// <returns></returns>
        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);
        }
        /// <summary>
        /// 根据urls获取ElasticClient
        /// </summary>
        /// <param name="urls"></param>
        /// <param name="defaultIndex"></param>
        /// <returns></returns>
        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<EsConfig>(Configuration.GetSection("EsConfig"));

操作数据库

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

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

 /// <summary>
    /// ElasticClient 扩展类
    /// </summary>
    public static class ElasticClientExtension
    {
        /// <summary>
        /// 创建索引
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="elasticClient"></param>
        /// <param name="indexName"></param>
        /// <param name="numberOfShards"></param>
        /// <param name="numberOfReplicas"></param>
        /// <returns></returns>
        public static bool CreateIndex<T>(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<T>(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;
        }
        /// <summary>
        /// XXX文档索引
        /// </summary>
        public ElasticClient Client_XXX => GetXXX();

        private ElasticClient GetXXX()
        {
	    //如果数据库中存在xxx则直接连接,如果不存在则新建后连接
            var client = _client.GetClient("XXX");
            if (!client.Indices.Exists("XXX").Exists)
            {
                client.CreateIndex<XXX>("XXX");
            }
            return client;
        }
    }

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

新增

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

查询

var res = _es.Client_XXX.Get<XXX>(esid);

删除

var res = _es.Client_XXX.Delete<XXX>(esid)

修改

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

还有更多的查询操作,可以查看官网内容:结构化搜索 | Elasticsearch: 权威指南 | Elastic

到此这篇关于.Net Api 之如何使用Elasticsearch存储文档的文章就介绍到这了,更多相关.Net Api 使用Elasticsearch存储文档内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

.Net Api 中使用Elasticsearch存储文档的方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

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

Java API文档的使用方法详解

在开发过程中如果遇到疑难问题,除了可以在网络中寻找答案,也可以在JavaAPI帮助文档(简称"JDK文档"”)中查找答案,下面这篇文章主要给大家介绍了关于Java API文档使用的相关资料,需要的朋友可以参考下
2023-02-01

SpringBoot使用swagger生成api接口文档的方法详解

在之前的文章中,使用mybatis-plus生成了对应的包,在此基础上,我们针对项目的api接口,添加swagger配置和注解,生成swagger接口文档,需要的可以了解一下
2022-11-13

inout在mysql存储中的使用方法

这篇文章主要介绍inout在mysql存储中的使用方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!mysql数据库的存储里,我们已经学过了输入和输出的参数。还有一种参数结合了前面所说两种参数的优势,既能输入也可以输
2023-06-14

Android使用文件进行数据存储的方法

本文实例讲述了Android使用文件进行数据存储的方法。分享给大家供大家参考。具体如下: 很多时候我们开发的软件需要对处理后的数据进行存储,以供再次访问。Android为数据存储提供了如下几种方式: 文件 SharedPreferences
2022-06-06

Android使用SharedPreferences存储XML文件的实现方法

本文实例讲述了Android使用SharedPreferences存储XML文件的实现方法。分享给大家供大家参考,具体如下: SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置比如窗口状态,
2022-06-06

.NET中Worker Service的使用方法

这篇文章主要介绍了.NET中Worker Service的使用方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。请先完成以下准备工作,以便于您理解本文。1、下载并安装最新的
2023-06-15

Android用文件存储数据的方法

本文实例为大家分享了Android用文件存储数据的具体代码,供大家参考,具体内容如下存储数据示例: private void saveFileData() { BufferedWriter writer = null; try
2023-05-30

NodeJS使用七牛云存储上传文件的方法

1-准备工作 确认安装node和npm 安装 qiniu,formidable,express模块npm install --save qiniu formidable[x] 导入模块let qiniu = require('qiniu')
2022-06-04

Android应用中使用SharedPreferences类存储数据的方法

在Android系统中提供了多种存储技术.通过这些存储技术可以将数据存储在各种存储介质上.比如sharedpreferences可以将数据保存着应用软件的私有存储区,这些存储区的数据只能被写入这些数据的软件读取.当然Android还支持文件
2022-06-06

MongoDB中怎么使用Save()方法更新文档

这篇文章将为大家详细讲解有关MongoDB中怎么使用Save()方法更新文档,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在MongoDB中,可以对操作的文档进行操作,例如如何在数据库中存在了该内容,这部
2023-06-14

Python Matplotlib中使用plt.savefig存储图片的方法举例

pytorch下保存图像有很多种方法,但是这些基本上都是基于图像处理的,将图像的像素指定一定的维度,下面这篇文章主要给大家介绍了关于Python Matplotlib中使用plt.savefig存储图片的相关资料,需要的朋友可以参考下
2023-02-14

MySql存储过程循环使用的方法

今天小编给大家分享一下MySql存储过程循环使用的方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。场景描述我们举一个简单的
2023-07-02

使用Go语言文档中的net/http.Handle函数实现HTTP路由

使用Go语言的net/http包中的Handle函数可以方便地实现HTTP路由。在这篇文章中,我们将一步一步地讲解如何使用Handle函数来实现一个简单的HTTP路由器。让我们逐步展开。首先,让我们来了解一下Handle函数的基本用法。Ha
使用Go语言文档中的net/http.Handle函数实现HTTP路由
2023-11-03

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录