.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,这里我们只使用最简单的账号,密码和数据库地址
/// <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存储文档的更多相关文章
- ElasticSearch(2)-文档
上一篇 ES(1) 官网原地址:https://www.elastic.co/guide/en/elasticsearch/reference/1.7/_cluster_health.html ES权 ...
- elasticsearch 路由文档到分片
路由文档到分片 当你索引一个文档,它被存储在单独一个主分片上.Elasticsearch是如何知道文档属于哪个分片的呢?当你创建一个新文档,它是如何知道是应该存储在分片1还是分片2上的呢? 进程不能是 ...
- Elasticsearch 索引文档如何使用自动生成 Id?
一个文档的 _index . _type 和 _id 唯一标识一个文档. 我们可以提供自定义的 _id 值,或者让 index API 自动生成. 如果你的数据没有自然的 ID, Elasticsea ...
- ElasticSearch——原始文档和倒排索引
一.原始文档 如上图所示, 第二象限是一份原始文档,有title和content2个字段,字段取值分别为”我是中国人”和” 热爱共X产党”,这一点没什么可解释的.我们把原始文档写入Elasticsea ...
- 007-elasticsearch5.4.3【一】概述、Elasticsearch 访问方式、Elasticsearch 面向文档、常用概念
一.概述 Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 基础之上. Elasticsearch 也是使用 Java 编写的,它的内部使用 L ...
- Elasticsearch 删除文档
章节 Elasticsearch 基本概念 Elasticsearch 安装 Elasticsearch 使用集群 Elasticsearch 健康检查 Elasticsearch 列出索引 Elas ...
- Elasticsearch 更新文档
章节 Elasticsearch 基本概念 Elasticsearch 安装 Elasticsearch 使用集群 Elasticsearch 健康检查 Elasticsearch 列出索引 Elas ...
- elasticsearch父子文档处理(join)
elasticsearch父子文档处理 join 一.背景 二.需求 三.前置知识 四.实现步骤 1.创建 mapping 2.添加父文档数据 3.添加子文档 4.查询文档 1.根据父文档id查询它下 ...
- .NET Core WEB API使用Swagger生成在线接口文档
1项目引用Swashbuckle.AspNetCore程序集和Microsoft.Extensions.PlatformAbstractions程序集 右击项目打开"管理NuGet程序包.. ...
随机推荐
- Android中Log信息的输出方法
第一步:在对应的mk文件中加入:LOCAL_LDLIBS:= -llog第二步:在要使用LOG的cpp文件中加入:#include <android/log.h>#define LOGD( ...
- 【LeetCode】面试题 16.11. 跳水板 Diving Board (Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 数学 日期 题目地址:https://leetcode ...
- 【LeetCode】5083. Occurrences After Bigram 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字符串分割遍历 日期 题目地址:https://le ...
- 【LeetCode】38. 外观数列 Count and Say
作者: 负雪明烛 id: fuxuemingzhu 公众号:负雪明烛 本文关键词:LeetCode,力扣,算法,算法题,外观数列,Count and Say,刷题群 目录 题目描述 题目大意 解题方法 ...
- 【LeetCode】581. Shortest Unsorted Continuous Subarray 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 方法一:排序比较 日期 题目地址:https://leetco ...
- 【LeetCode】888. Fair Candy Swap 公平的糖果棒交换(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人公众号: 每日算法题 本文关键词:力扣,LeetCode,算法题,算法,Python 目录 题目描述 题目大意 解题方法 代码 刷题心得 关于作 ...
- 团队编程二——web应用之人事管理系统
该项目是B-S模式的web应用,以下是团队各成员的Coding链接: ------Aaric---https://coding.net/u/Aaric/p/Personnel_management_s ...
- Scale-Invariant Error
目录 概 主要内容 代码 Eigen D., Puhrsch C. and Fergus R. Depth Map Prediction from a Single Image using a Mul ...
- Python Revisited Day 08 (高级程序设计技术)
目录 8.1 过程型程序设计进阶 8.1.1 使用字典进行分支 8.1.2 生成器表达式与函数 8.1.3 动态代码执行与动态导入 动态程序设计与内省函数(表) 动态代码执行 eval(), exec ...
- 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端口的高度集成.高 ...