.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存储文档的更多相关文章

  1. ElasticSearch(2)-文档

    上一篇 ES(1) 官网原地址:https://www.elastic.co/guide/en/elasticsearch/reference/1.7/_cluster_health.html ES权 ...

  2. elasticsearch 路由文档到分片

    路由文档到分片 当你索引一个文档,它被存储在单独一个主分片上.Elasticsearch是如何知道文档属于哪个分片的呢?当你创建一个新文档,它是如何知道是应该存储在分片1还是分片2上的呢? 进程不能是 ...

  3. Elasticsearch 索引文档如何使用自动生成 Id?

    一个文档的 _index . _type 和 _id 唯一标识一个文档. 我们可以提供自定义的 _id 值,或者让 index API 自动生成. 如果你的数据没有自然的 ID, Elasticsea ...

  4. ElasticSearch——原始文档和倒排索引

    一.原始文档 如上图所示, 第二象限是一份原始文档,有title和content2个字段,字段取值分别为”我是中国人”和” 热爱共X产党”,这一点没什么可解释的.我们把原始文档写入Elasticsea ...

  5. 007-elasticsearch5.4.3【一】概述、Elasticsearch 访问方式、Elasticsearch 面向文档、常用概念

    一.概述 Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 基础之上. Elasticsearch 也是使用 Java 编写的,它的内部使用 L ...

  6. Elasticsearch 删除文档

    章节 Elasticsearch 基本概念 Elasticsearch 安装 Elasticsearch 使用集群 Elasticsearch 健康检查 Elasticsearch 列出索引 Elas ...

  7. Elasticsearch 更新文档

    章节 Elasticsearch 基本概念 Elasticsearch 安装 Elasticsearch 使用集群 Elasticsearch 健康检查 Elasticsearch 列出索引 Elas ...

  8. elasticsearch父子文档处理(join)

    elasticsearch父子文档处理 join 一.背景 二.需求 三.前置知识 四.实现步骤 1.创建 mapping 2.添加父文档数据 3.添加子文档 4.查询文档 1.根据父文档id查询它下 ...

  9. .NET Core WEB API使用Swagger生成在线接口文档

    1项目引用Swashbuckle.AspNetCore程序集和Microsoft.Extensions.PlatformAbstractions程序集 右击项目打开"管理NuGet程序包.. ...

随机推荐

  1. cmake之生成动态库

    演示源码下载地址: https://github.com/mohistH/demo_cmake_dylib 把文仅为参考. 以实际情况为准 1.目录结构 │ CMakeLists.txt │ inde ...

  2. 【LeetCode】215. Kth Largest Element in an Array 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:移除最大值 方法二:排序 方法三:大顶堆 方 ...

  3. 【LeetCode】649. Dota2 Senate 解题报告(Python)

    [LeetCode]649. Dota2 Senate 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地 ...

  4. 【剑指Offer】丑数 解题报告

    [剑指Offer]丑数 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目描述: ...

  5. codeforce-600C. Make Palindrome(贪心)

    http://codeforces.com/problemset/problem/600/C: 题意:给你一个小写字母组成的英文串,将它转换为回文串,要求,改变的字母的个数最小,移动字母不算改变字母. ...

  6. 1307 - Counting Triangles

    1307 - Counting Triangles    PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 ...

  7. bugku的一道XFF转发代理服务器题 “本地服务器”

    X-Forwarded-For requests包内构造方式: X-Forwarded-For: client1, proxy1, proxy2

  8. Java 将Excel转为OFD

    OFD是一种开放版式文档(Open Fixed-layout Document )的英文缩写,是我国国家版式文档格式标准.本文,通过Java后端程序代码展示如何将Excel转为OFD格式.方法步骤如下 ...

  9. [数据结构]链表LinkList

    目录 1.3 链表 1.3.1 头插法建立单链表 1.3.2 限制链表长度建立单链表 1.3.3 尾插法建立单链表 1.3.4 按序号查找单链表 1.3.5 按值查找单链表 1.3.6 链表的插入 1 ...

  10. RTD2171U替代方案|CS5266Typec转HDMI 4K60HZ转换芯片方案|CS5266芯片

    RTD2171U 是一款USB Type-C到HDMI转换器结合了USB Type-C输入接口和数字高清多媒体接口(HDMI)输出转换芯片.嵌入式微控制器基于工业标准8051内核.接收器端口将信道配置 ...