.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. Android中Log信息的输出方法

    第一步:在对应的mk文件中加入:LOCAL_LDLIBS:= -llog第二步:在要使用LOG的cpp文件中加入:#include <android/log.h>#define LOGD( ...

  2. 【LeetCode】面试题 16.11. 跳水板 Diving Board (Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 数学 日期 题目地址:https://leetcode ...

  3. 【LeetCode】5083. Occurrences After Bigram 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字符串分割遍历 日期 题目地址:https://le ...

  4. 【LeetCode】38. 外观数列 Count and Say

    作者: 负雪明烛 id: fuxuemingzhu 公众号:负雪明烛 本文关键词:LeetCode,力扣,算法,算法题,外观数列,Count and Say,刷题群 目录 题目描述 题目大意 解题方法 ...

  5. 【LeetCode】581. Shortest Unsorted Continuous Subarray 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 方法一:排序比较 日期 题目地址:https://leetco ...

  6. 【LeetCode】888. Fair Candy Swap 公平的糖果棒交换(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人公众号: 每日算法题 本文关键词:力扣,LeetCode,算法题,算法,Python 目录 题目描述 题目大意 解题方法 代码 刷题心得 关于作 ...

  7. 团队编程二——web应用之人事管理系统

    该项目是B-S模式的web应用,以下是团队各成员的Coding链接: ------Aaric---https://coding.net/u/Aaric/p/Personnel_management_s ...

  8. Scale-Invariant Error

    目录 概 主要内容 代码 Eigen D., Puhrsch C. and Fergus R. Depth Map Prediction from a Single Image using a Mul ...

  9. Python Revisited Day 08 (高级程序设计技术)

    目录 8.1 过程型程序设计进阶 8.1.1 使用字典进行分支 8.1.2 生成器表达式与函数 8.1.3 动态代码执行与动态导入 动态程序设计与内省函数(表) 动态代码执行 eval(), exec ...

  10. Capstone CS5266替代AG9311 Type-C转HDMI带PD3.0+USB3.0拓展坞方案

    Capstone CS5266替代AG9311   Type-C转HDMI带PD3.0+USB3.0拓展坞方案CS5266是 Capstone 最新推出的一款用于USB TYPE-C端口的高度集成.高 ...