ElasticSearch入门 附.Net Core例子

https://www.cnblogs.com/CoderAyu/p/9564977.html

1.什么是ElasticSearch?

Elasticsearch是基于Lucene的搜索引擎。它提供了一个分布式,支持多租户的全文搜索引擎,它具有HTTP Web界面和无模式JSON文档。 Elasticsearch是用Java开发的,根据Apache许可条款作为开源发布。

----来自维基百科的解释

我个人的理解是Elasticsearch(以下简称ES)是一个支持分布式的全文搜索引擎,因为在海量数据搜索时,普通关系型、非关系型数据库因为IO读取、处理器运算能力的限制,导致查询效率难以提升,但是ES是分布式的(能把处理压力分摊给每个节点),而且它是给每个词创建索引,所以查询效率极高,堪称即时搜索。

而且ES能搭配Kibana,实现数据的可视化管理与数据分析。

QQ截图20180906215325

  1. Kibana仪表盘

2.ES中名词概念

2.1 Node和Cluster

前面所过ES是一个分布式搜索引擎,其本质是一个分布式数据库,可以多台计算机上的ES实例协同工作,这里面的某一台计算机上的某个ES实例,就可以称为一个Node(节点),所有的这些协同工作的实例,可以称为一个Cluster(集群)。

2.2 Index

Elastic 会索引所有字段,经过处理后写入一个反向索引(Inverted Index)。查找数据的时候,直接查找该索引。

所以,Elastic 数据管理的顶层单位就叫做 Index(索引)。它是单个数据库的同义词。每个 Index (即数据库)的名字必须是小写。

2.3 Document

Index 里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。

Document 使用 JSON 格式表示,下面是一个例子。

{

"user": "张三",

"title": "工程师",

"desc": "数据库管理"

}

同一个 Index 里面的 Document,不要求有相同的结构(scheme),但是最好保持相同,这样有利于提高搜索效率。

2.4 Type

Document 可以分组,比如weather这个 Index 里面,可以按城市分组(北京和上海),也可以按气候分组(晴天和雨天)。这种分组就叫做 Type,它是虚拟的逻辑分组,用来过滤 Document。

不同的 Type 应该有相似的结构(schema),举例来说,id字段不能在这个组是字符串,在另一个组是数值。这是与关系型数据库的表的一个区别。性质完全不同的数据(比如products和logs)应该存成两个 Index,而不是一个 Index 里面的两个 Type(虽然可以做到)。

根据规划,Elastic 6.x 版只允许每个 Index 包含一个 Type,7.x 版将会彻底移除 Type。

----参考阮一峰 全文搜索引擎 Elasticsearch 入门教程

3.ES工作原理

Elasticsearch用于构建高可用和可扩展的系统。扩展的方式可以是购买更好的服务器(纵向扩展)或者购买更多的服务器(横向扩展)。

Elasticsearch虽然能从更强大的硬件中获得更好的性能,但是纵向扩展有它的局限性。真正的扩展应该是横向的,它通过增加节点来均摊负载和增加可靠性。如果我们启动一个单独的节点,它还没有数据和索引,这个集群看起来就像下图。

集群中一个节点会被选举为主节点(master),它将临时管理集群级别的一些变更,例如新建或删除索引、增加或移除节点等。

主节点不参与文档级别的变更或搜索,这意味着在流量增长的时候,该主节点不会成为集群的瓶颈。任何节点都可以成为主节点。我们例子中的集群只有一个节点,所以它会充当主节点的角色。

当索引创建完成的时候,主分片的数量就固定了,但是复制分片的数量可以随时调整。

让我们在集群中唯一一个空节点上创建一个叫做 blogs 的索引。默认情况下,一个索引被分配5个主分片,但是为了演示的目的,我们只分配3个主分片和一个复制分片(每个主分片都有一个复制分片):

PUT /blogs

{

"settings" : {

"number_of_shards" : 3,

"number_of_replicas" : 1

}

}

我们的集群现在看起来就像上图,三个主分片都被分配到 Node 1 。

在单一节点上运行意味着有单点故障的风险:没有数据备份。幸运的是,要防止单点故障,我们唯一需要做的就是启动另一个节点。

如果我们启动了第二个节点,这个集群看起来就像下图

第二个节点已经加入集群,三个复制分片(replica shards)也已经被分配了,分别对应三个主分片,这意味着在丢失任意一个节点的情况下依旧可以保证数据的完整性。

文档的索引将首先被存储在主分片中,然后并发复制到对应的复制节点上。这可以确保我们的数据在主节点和复制节点上都可以被检索。

随着应用需求的增长,我们该如何扩展?如果我们启动第三个节点,我们的集群会自我感知,这时便成为了三节点集群。

分片已经被重新分配以平衡负载:

从 Node 1 和 Node 2 来的分片已经被移动到新的 Node 3 上,这样每个节点就有两个分片,以代替之前的三个。这意味着每个节点的硬件资源(CPU、RAM、I/O)被较少的分片共享,这样每个分片就会有更好的表现。

分片本身就是一个完整成熟的搜索引擎,它可以使用单一节点的所有资源。使用这6个分片(3个主分片和三个复制分片)我们可以扩展最多到6个节点,每个节点上有一个分片,这样就可以100%使用这个节点的资源了。

----参考文献Elasticsearch: 权威指南

4.ES的安装与使用

4.1安装

因为每个平台上ES安装方法有所区别,而且网络上有较为详细的安装教程,本文在此不再赘述。原本是想着在我的两台腾讯云Centos服务器上,搭建一个ES集群的,但是因为云服务器内存1G,运行ES时总是报错,大体意思是内存不足,所以我就在自己的PC上,只搭建了一个ES节点,还不算ES集群,不过不影响功能的测试。

Windows环境下ES 6.4 MSI下载地址:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.0.msi

一路默认下一步,安装完成后,在浏览器地址输入http://localhost:9200/,如果您能看到下列结果,说明安装完成。

复制代码

{

"name": "DESKTOP-1FC1B1D",

"cluster_name": "elasticsearch",

"cluster_uuid": "lZx4n2xzToeaj9k3HEHAqw",

"version": {

"number": "6.4.0",

"build_flavor": "unknown",

"build_type": "unknown",

"build_hash": "595516e",

"build_date": "2018-08-17T23:18:47.308994Z",

"build_snapshot": false,

"lucene_version": "7.4.0",

"minimum_wire_compatibility_version": "5.6.0",

"minimum_index_compatibility_version": "5.0.0"

},

"tagline": "You Know, for Search"

}

复制代码

"You Know, for Search"

ES有一套Restful 风格的API系统,通过该API我们与ES进行交互。

4.2数据的提交

利用PostMan向ES POST一条数据如下。

image

http://localhost:9200/index/test1/1 中Index是该数据的Index(上文有介绍Index),test1是该数据的Type,1是该条数据的Id,该ID在通过ID获取数据时需要用到。

4.3数据通过ID获取

在知道数据的Index,Type和ID的情况下,可以通过和上文Post数据的Url一样的格式获取数据,不同之处时,此时的HTTP方法时Get,如下:

image

4.4数据的查询

ES的数据查询语法较为丰富,此处以一个最简单的查询为例,Http方法为POST,请求的Url中同样指定了Index和Type

{

"query" : { "match" : { "tagline" : "for" }}

}

指的时查询tagline中包含的for的数据,

image

其他更详细的查询语法,建议大家查看Elasticsearch: 权威指南,此处主要抛砖引玉。

5.Net Core中使用ES

在上文中,我们了解到,可以通过restful api与ES进行交互,那么,如果需要在我们的程序中使用ES,是不是要创建一个这样的Helper方法,通过HTTP调用RESTFul API与ES进行交互呢?

不是不可以,但是Elastic为大部分语言都创建了"Clients”,其实就是把上文提及的那些方法进行了一个封装,是我们在代码中,能够方便地调用ES。

以.Net Core为例,该”Clients”开源在Github:

https://github.com/elastic/elasticsearch-net

5.1 SDK(客户端,Clients)

在该仓库中,其实有Elasticsearch.Net 和 NEST两个.Net官方SDK,两个各有特色。

Elasticsearch.Net 是一个非常low leave而且灵活的SDK,它不在意你如何的构建自己的请求和响应。它非常抽象,因此所有的Elasticsearch RESTFul API被表示为方法,而且不会影响你构建json / request / response对象的方式。 它还内置可配置/可覆盖的群集故障转移重试机制。

NEST 是一个 high level SDK, 有非常大的弹性,如果你想更好的提升你的搜索服务,你完全可以使用它来做为你的客户端。可以映射所有请求和响应对象,拥有一个强类型DSL(领域特定语言),并且可以使用.net的特性,如协变、Auto Mapping Of POCOs,NEST内部使用的依然是Elasticsearch.Net客户端。

5.2创建一个Demo

本Demo我使用的NEST,所以第一步是创建一个Asp.Net Core Api应用程序并引入NEST的Nuget包。

PM> Install-Package NEST

然后我创建一个EsClientProvider,代码如下:

复制代码

public class EsClientProvider : IEsClientProvider

{

private readonly IConfiguration _configuration;

private ElasticClient _client;

public EsClientProvider(IConfiguration configuration)

{

_configuration = configuration;

}

  1. public ElasticClient GetClient()
  2. {
  3. if (_client != null)
  4. return _client;
  5. InitClient();
  6. return _client;
  7. }
  8. private void InitClient()
  9. {
  10. var node = new Uri(_configuration["EsUrl"]);
  11. _client = new ElasticClient(new ConnectionSettings(node).DefaultIndex("demo"));
  12. }
  13. }

复制代码

IEsClientProvider代码如下:

public interface IEsClientProvider

{

ElasticClient GetClient();

}

然后再Startup的ConfigureServices进行服务的注册

复制代码

public void ConfigureServices(IServiceCollection services)

{

  1. services.AddSingleton<IEsClientProvider, EsClientProvider>();
  2. services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
  3. }

复制代码

最后,修改ValueContoller,代码如下:

复制代码

public class ValueController : ControllerBase

{

private readonly ElasticClient _client;

  1. public ValueController(IEsClientProvider clientProvider)
  2. {
  3. _client = clientProvider.GetClient();
  4. }
  5. [HttpPost]
  6. [Route("value/index")]
  7. public IIndexResponse Index(Post post)
  8. {
  9. return _client.IndexDocument(post);
  10. }
  11. [HttpPost]
  12. [Route("value/search")]
  13. public IReadOnlyCollection<Post> Search(string type)
  14. {
  15. return _client.Search<Post>(s => s
  16. .From(0)
  17. .Size(10)
  18. .Query(q => q.Match(m => m.Field(f => f.Type).Query(type)))).Documents;
  19. }
  20. }

复制代码

其中Index方法能进行数据的提交,Search是通过Post实体的type来进行数据查询。

代码不复杂,我就不详细介绍了,在PostMan中进行Search方法的测试,效果如下:

image

查询要求是type是567,响应的实体中,type确实为567,Success!

项目完整代码:https://github.com/liuzhenyulive/Elasticsearch.Net-Demo

Net Core ElasticSearch入门的更多相关文章

  1. ElasticSearch入门 附.Net Core例子

    1.什么是ElasticSearch? Elasticsearch是基于Lucene的搜索引擎.它提供了一个分布式,支持多租户的全文搜索引擎,它具有HTTP Web界面和无模式JSON文档. Elas ...

  2. 《驾驭Core Data》 第二章 Core Data入门

    本文由海水的味道编译整理,请勿转载,请勿用于商业用途.    当前版本号:0.4.0 第二章 Core Data入门 本章将讲解Core Data框架中涉及的基本概念,以及一个简单的Core Data ...

  3. ElasticSearch入门-搜索如此简单

    搜索引擎我也不是很熟悉,但是数据库还是比较了解.可以把搜索理解为数据库的like功能的替代品.因为like有以下几点不足: 第一.like的效率不行,在使用like时,一般都用不到索引,除非使用前缀匹 ...

  4. ElasticSearch入门知识扫盲

    ElasticSearch 入门介绍 tags: 第三方 lucene [toc] 1. what Elastic Search(ES)是什么 全文检索和lucene 全文检索 优点:高效,准确,分词 ...

  5. 005.Getting started with ASP.NET Core MVC and Visual Studio -- 【VS开发asp.net core mvc 入门】

    Getting started with ASP.NET Core MVC and Visual Studio VS开发asp.net core mvc 入门 2017-3-7 2 分钟阅读时长 本文 ...

  6. .NET Core 快速入门教程

    .NET Core 快速学习.入门系列教程.这个入门系列教程主要跟大家聊聊.NET Core的前世今生,以及Windows.Linux(CentOS.Ubuntu)基础开发环境的搭建.第一个.NET ...

  7. .NET Core快速入门教程 2、我的第一个.NET Core App(Windows篇)

    一.前言 本篇开发环境?1.操作系统: Windows 10 X642.SDK: .NET Core 2.0 Preview 二.安装 .NET Core SDK 1.下载 .NET Core下载地址 ...

  8. asp.net core轻松入门之MVC中Options读取配置文件

    接上一篇中讲到利用Bind方法读取配置文件 ASP.NET Core轻松入门Bind读取配置文件到C#实例 那么在这篇文章中,我将在上一篇文章的基础上,利用Options方法读取配置文件 首先注册MV ...

  9. .NET Core快速入门教程 5、使用VS Code进行C#代码调试的技巧

    一.前言 为什么要调试代码?通过调试可以让我们了解代码运行过程中的代码执行信息,比如变量的值等等.通常调试代码是为了方便我们发现代码中的bug.ken.io觉得熟练代码调试技巧是成为合格程序员的基本要 ...

随机推荐

  1. Linux安全策略配置-pam_tally2身份验证模块

    PAM身份验证安全配置实例 - 强制使用强密码(用户密码安全配置) - 用户SSH登录失败尝试次数超出限制后锁定账户(帐户锁定/解锁和时间设置) - 允许普通用户使用sudo而不是su(限制普通用户登 ...

  2. ng-click得到当前元素,

    直接上代码: <!DOCTYPE html> <html> <head> <title></title> <script src=&q ...

  3. dbml 注意事项

    1,修改dbml中的字段,需要修改2个地方

  4. 多线程-模拟阻塞queue队列

    前阵子学习了多线程,现在进行总结一下,模拟队列. 分析问题: (1)首先需要一个容器存放元素,这里用linkedList队列. (2)每次像容器中添加或删除元素的时候需要计数,所以这里需要一个计数器, ...

  5. JS Object To C# ASP.Net ModelBind

    之前做项目的时候发现,Jquery自带的Form 序列化函数.与asp.net 里边的Modelbinding格式不匹配,所以写了一个可以把前端的Object对象序列化成ModelBinding认识的 ...

  6. Android开发-Android Studio安装

    开发平台:Windows 7 旗舰版,SP1 开发工具:Android Studio1.2正式版 1.打开http://www.androiddevtools.cn/ ,找到Android Studi ...

  7. java手动分页处理

    经常我们在操作数据库的时候都会用到分页,而且很多框架也提供了分页功能,像PageHelper. 但是在有些项目中,需要将数据查询出来进行手动分页,那么原理是什么呢? 其实很简单,首先需要知道数据总量, ...

  8. 带你彻底明白 Android Studio 打包混淆

    前言 在使用Android Studio混淆打包时,该IDE自身集成了Java语言的ProGuard作为压缩,优化和混淆工具,配合Gradle构建工具使用很简单.只需要在工程应用目录的gradle文件 ...

  9. Android 必须知道2018年流行的框架库及开发语言,看这一篇就够了!

    导语 2017 已经悄悄的走了,2018 也已经匆匆的来了,我们在总结过去的同时,也要展望一下未来,来规划一下今年要学哪些新技术.这几年优秀Android的开源库不断推出,新技术层出不穷,需要我们不断 ...

  10. 新东方雅思词汇---8.1、reckon

    新东方雅思词汇---8.1.reckon 一.总结 一句话总结:reck(注意,留心)+on 英 ['rek(ə)n]  美 ['rɛkən]  vt. 测算,估计:认为:计算 vi. 估计:计算:猜 ...