关于ElasticSearch

Elasticsearch是一个分布式的开源搜索和分析引擎,适用于所有类型的数据,包括文本、数字、地理空间、结构化和非结构化数据。Elasticsearch 在 Apache Lucene 的基础上开发而成,由 Elasticsearch N.V.(即现在的 Elastic)于 2010 年首次发布。Elasticsearch 以其简单的 REST 风格 API、分布式特性、速度和可扩展性而闻名,是 Elastic Stack 的核心组件;Elastic Stack 是适用于数据采集、充实、存储、分析和可视化的一组开源工具。人们通常将 Elastic Stack 称为 ELK Stack(代指 ElasticsearchLogstashKibana),目前 Elastic Stack 包括一系列丰富的轻量型数据采集代理,这些代理统称为 Beats,可用来向 Elasticsearch 发送数据。

ElasticSearch用途

  • 应用程序搜索
  • 网站搜索
  • 企业搜索
  • 日志处理和分析
  • 基础设施指标和容器监测
  • 应用程序性能监测
  • 地理空间数据分析和可视化
  • 安全分析
  • 业务分析

工作原理

原始数据会从多个来源(包括日志、系统指标和网络应用程序)输入到 Elasticsearch 中。数据采集指在 Elasticsearch 中进行索引之前解析、标准化并充实这些原始数据的过程。这些数据在 Elasticsearch 中索引完成之后,用户便可针对他们的数据运行复杂的查询,并使用聚合来检索自身数据的复杂汇总。在 Kibana 中,用户可以基于自己的数据创建强大的可视化,分享仪表板,并对 Elastic Stack 进行管理。

索引是什么

Elasticsearch 索引指相互关联的文档集合。Elasticsearch 会以 JSON 文档的形式存储数据。每个文档都会在一组键(字段或属性的名称)和它们对应的值(字符串、数字、布尔值、日期、数值组、地理位置或其他类型的数据)之间建立联系。

Elasticsearch 使用的是一种名为倒排索引的数据结构,这一结构的设计可以允许十分快速地进行全文本搜索。倒排索引会列出在所有文档中出现的每个特有词汇,并且可以找到包含每个词汇的全部文档。

在索引过程中,Elasticsearch 会存储文档并构建倒排索引,这样用户便可以近实时地对文档数据进行搜索。索引过程是在索引 API 中启动的,通过此 API 您既可向特定索引中添加 JSON 文档,也可更改特定索引中的 JSON 文档。

为何使用Elasticsearch

Elasticsearch很快。 由于Elasticsearch 是在 Lucene 基础上构建而成的,所以在全文本搜索方面表现十分出色。Elasticsearch 同时还是一个近实时的搜索平台,这意味着从文档索引操作到文档变为可搜索状态之间的延时很短,一般只有一秒。因此,Elasticsearch 非常适用于对时间有严苛要求的用例,例如安全分析和基础设施监测。

Elasticsearch具有分布式的本质特征。 Elasticsearch 中存储的文档分布在不同的容器中,这些容器称为分片,可以进行复制以提供数据冗余副本,以防发生硬件故障。Elasticsearch 的分布式特性使得它可以扩展至数百台(甚至数千台)服务器,并处理 PB 量级的数据。

Elasticsearch 包含一系列广泛的功能。 除了速度、可扩展性和弹性等优势以外,Elasticsearch 还有大量强大的内置功能(例如数据汇总和索引生命周期管理),可以方便用户更加高效地存储和搜索数据。

Elastic Stack 简化了数据采集、可视化和报告过程。 通过与 Beats 和 Logstash 进行集成,用户能够在向 Elasticsearch 中索引数据之前轻松地处理数据。同时,Kibana 不仅可针对 Elasticsearch 数据提供实时可视化,同时还提供 UI 以便用户快速访问应用程序性能监测 (APM)、日志和基础设施指标等数据。

Elasticsearch免费吗

用户可以基于 Apache 2 许可证免费使用 Elasticsearch 的开源功能。用户还可基于 Elastic 许可证使用更多免费功能,同时通过付费订阅服务,可以获取支持并使用诸如 Alerting 和 Machine Learning 等高级功能。

Elasticsearch案例

  • 2013年初,GitHub抛弃了Solr,采取ElasticSearch 来做PB级的搜索。 “GitHub使用ElasticSearch搜索20TB的数据,包括13亿文件和1300亿行代码”
  • 维基百科:启动以elasticsearch为基础的核心搜索架构
  • SoundCloud:“SoundCloud使用ElasticSearch为1.8亿用户提供即时而精准的音乐搜索服务”
  • 百度:百度目前广泛使用ElasticSearch作为文本数据分析,采集百度所有服务器上的各类指标数据及用户自定义数据,通过对各种数据进行多维分析展示,辅助定位分析实例异常或业务层面异常。目前覆盖百度内部20多个业务线(包括casio、云分析、网盟、预测、文库、直达号、钱包、风控等),单集群最大100台机器,200个ES节点,每天导入30TB+数据
  • 新浪使用ES 分析处理32亿条实时日志
  • 阿里使用ES 构建挖财自己的日志采集和分析体系

Elasticsearch正式分发包

基于WSL2的Docker Desktop配置

如果你打算将ES用于生产,你需要把Docker设置下vm.max_map_count参数

在PS里面运行如下命令即可

  1. wsl -d docker-desktop
  2. sysctl -w vm.max_map_count=262144

Elasticsearch安装By Docker On WSL2

1. 基本安装

  1. docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.9.1

2. 定制安装

以下操作均在Ubuntu的Root用户下执行,如果切换Root,请su root

  1. 先以非挂载模式运行实例,后续再操作挂载,不然会有权限问题
  1. docker run --publish 9200:9200 --publish 9300:9300 -e "discovery.type=single-node" --name elasticsearch --restart always \
  2. elasticsearch:7.9.1

这样得到一个临时的运行实例,访问http://localhost:9200查看是否成功,如果成功,继续后续操作。

  1. 创建挂载持久化数据的目录

切换到你希望持久化的根目录,在这个目录底下创建关于elasticsearch两个关键目录dataconfig

  1. mkdir elasticsearch
  2. cd elasticsearch/
  3. mkdir data
  4. mkdir config

以笔者为例,创建成功之后,最终会得到以下两个目录:

  • /home/username/elasticsearch/data/
  • /home/username/elasticsearch/config/
  1. 拷贝实例的当前Data和Config到我们创建的目录。
  1. docker cp elasticsearch:/usr/share/elasticsearch/data /home/username/elasticsearch/
  2. docker cp elasticsearch:/usr/share/elasticsearch/config /home/username/elasticsearch/

它会自动把运行实例下dataconfig所有文件拷贝到我们创建的那两个对应文件夹中。

  1. 停止并删除之前的实例,重新创建带持久化挂载的实例。

先删除

  1. docker stop elasticsearch
  2. docker rm elasticsearch

再创建

  1. docker run --publish 9200:9200 --publish 9300:9300 -e "discovery.type=single-node" --name elasticsearch --restart always \
  2. --volume /home/username/elasticsearch/data/:/usr/share/elasticsearch/data \
  3. --volume /home/username/elasticsearch/config/:/usr/share/elasticsearch/config \
  4. elasticsearch:7.9.1
  • 绑定/usr/share/elasticsearch/data目录可以防止重启实例时数据丢失。
  • 绑定/usr/share/elasticsearch/config/目录可以防止重启实例时配置丢失。
  • 设置--restart always可以确保重启Docker时自动启动es。
  • 镜像直接使用elasticsearch:7.9.1将从Docker Hub搜索镜像并拉取。
  • 请务必将其中的username替换成你本地的用户名。
  • https://hub.docker.com/_/elasticsearch

恭喜你,这时候就完美运行起来了。

访问ES管理后台

  1. {
  2. "name" : "dc7593c4d74d",
  3. "cluster_name" : "docker-cluster",
  4. "cluster_uuid" : "YqAcQFMnRamIdLHBIRNVjg",
  5. "version" : {
  6. "number" : "7.9.1",
  7. "build_flavor" : "default",
  8. "build_type" : "docker",
  9. "build_hash" : "083627f112ba94dffc1232e8b42b73492789ef91",
  10. "build_date" : "2020-09-01T21:22:21.964974Z",
  11. "build_snapshot" : false,
  12. "lucene_version" : "8.6.2",
  13. "minimum_wire_compatibility_version" : "6.8.0",
  14. "minimum_index_compatibility_version" : "6.0.0-beta1"
  15. },
  16. "tagline" : "You Know, for Search"
  17. }

看到类似返回,就说明运行成功了。

Kibana安装By Docker On WSL2

  1. docker run --publish 5601:5601 --name kibana --restart always \
  2. --link elasticsearch:elasticsearch \
  3. kibana:7.9.1

安装运行成功之后,可打开网址:http://localhost:5601

ElasticSearch常见操作

检查集群或节点健康情况

http://localhost:9200/_cat/health?v

  • green:每个索引的primary shard和replica shard都是active状态的
  • yellow:每个索引的primary shard都是active状态的,但是部分replica shard不是active状态,处于不可用的状态
  • red:不是所有索引的primary shard都是active状态的,部分索引有数据丢失了

查看所有的索引及统计

http://localhost:9200/_cat/indices?v

创建和删除索引

  • 创建索引
  1. PUT http://localhost:9200/yourindexname
  2. {
  3. "settings" : {
  4. "number_of_shards" : 3, # 分片数
  5. "number_of_replicas" : 1 # 副本数
  6. }
  7. }
  • 删除索引
  1. DELETE http://localhost:9200/yourindexname

.Net Core的ES开发包

ES主要是通过RESTFul风格的API来进行操作的,本身是没有提供UI界面,如果.Net Core程序想要操作,除了自己写相关的API调用代码,最方便的方法就是直接安装官方提供的Nuget包。

这两的差异就是,说白了NEST就是基于Elasticsearch.Net来实现的。

简单说呢,Elasticsearch.Net是粗狂豪放型,可以非常自由的组织API请求内容,任君发挥了

NEST是结合.Net高级特性的高级语法糖封装,可以让你类LINQ的方式来编写你的代码。

总结而言,还是推荐先用高级封装的NEST吧,这样能让问题更简单一些。

Nuget安装到现有项目中

搜索关键词安装即可

  1. NEST

开始编写代码

  1. 连接ElasticSearch
  1. var singleNode = new Uri("http://localhost:9200");
  2. var connSettings = new ConnectionSettings(singleNode);
  3. var esClient = new ElasticClient(connSettings);

如果是链接多Node节点。

  1. var nodes = new Uri[]
  2. {
  3. new Uri("http://esNode1:9200"),
  4. new Uri("http://esNode2:9200"),
  5. new Uri("http://esNode3:9200")
  6. };
  7. var pool = new StaticConnectionPool(nodes);
  8. var settings = new ConnectionSettings(pool);
  9. var client = new ElasticClient(settings);
  1. 写入新数据并自动创建索引
  1. /// <summary>
  2. /// 用户信息模型
  3. /// </summary>
  4. public class UserInfo
  5. {
  6. /// <summary>
  7. /// 名字
  8. /// </summary>
  9. public string Name { get; set; }
  10. }
  1. var userInfo = new UserInfo { Name = "demoname" };
  2. var nodeUri = new Uri("http://localhost:9200");
  3. var connSetting = new ConnectionSettings(nodeUri);
  4. var targetIndexName = "demo_indexname";
  5. var esClient = new ElasticClient(connSetting.DefaultIndex(targetIndexName));
  6. // 初始化索引
  7. esClient.IndexDocument(userInfo);
  8. // 或者 推荐异步语法糖写法
  9. var response = await esClient.IndexAsync(userInfo, idx => idx.Index(targetIndexName));

以上动作,在最后一句才会发出HTTP API请求,内容如下:

  1. POST http://localhost:9200/demo_indexname/_doc
  2. {"name":"demoname"}

值得注意,这里面demo_indexname是索引的名字,这里面_doc是索引的默认_type名字

另外,你会发现,NEST框架已经自动把UserInfo模型的大写转成驼峰小写了,非常方便。

  1. 获取指定ID的文档数据
  1. // 获取指定文档Id的文档内容
  2. var targetIndexName = "demo_indexname";
  3. var response = await esClient.GetAsync<UserInfo>("rnwnnXQBwd6SZB0378vX", idx => idx.Index(targetIndexName));
  4. var userInfo = response.Source;

以上动作,发出HTTP API请求,内容如下:

  1. GET http://localhost:9200/demo_indexname/_doc/rnwnnXQBwd6SZB0378vX

如果找不到就会返回404,这时候拿到的对象就是NULL,如果找得到就能正确返回对象数据。

  1. {
  2. "_index": "demo_indexname",
  3. "_type": "_doc",
  4. "_id": "rnwnnXQBwd6SZB0378vX",
  5. "_version": 1,
  6. "_seq_no": 0,
  7. "_primary_term": 1,
  8. "found": true,
  9. "_source": {
  10. "name": "demoname"
  11. }
  12. }
  1. 基于LINQ模式查询目标文档
  1. // 基于LINQ模式查询目标文档
  2. var response = await esClient.SearchAsync<UserInfo>(s => s
  3. .Index(targetIndexName)
  4. .From(0)
  5. .Size(10)
  6. .Query(q => q.Term(t => t.Name, "demoname") || q.Match(m => m.Field(f => f.Name).Query("demoname"))
  7. )
  8. );
  9. var userinfos = response.Documents;

  1. POST http://localhost:9200/demo_indexname/_search?typed_keys=true
  2. {
  3. "from": 0,
  4. "query": {
  5. "bool": {
  6. "should": [
  7. {
  8. "term": {
  9. "name": {
  10. "value": "demoname"
  11. }
  12. }
  13. },
  14. {
  15. "match": {
  16. "name": {
  17. "query": "demoname"
  18. }
  19. }
  20. }
  21. ]
  22. }
  23. },
  24. "size": 10
  25. }
  1. {
  2. "took": 0,
  3. "timed_out": false,
  4. "_shards": {
  5. "total": 1,
  6. "successful": 1,
  7. "skipped": 0,
  8. "failed": 0
  9. },
  10. "hits": {
  11. "total": {
  12. "value": 1,
  13. "relation": "eq"
  14. },
  15. "max_score": 0.5753642,
  16. "hits": [
  17. {
  18. "_index": "demo_indexname",
  19. "_type": "_doc",
  20. "_id": "rnwnnXQBwd6SZB0378vX",
  21. "_score": 0.5753642,
  22. "_source": {
  23. "name": "demoname"
  24. }
  25. }
  26. ]
  27. }
  28. }

  1. 带指定ID的创建对象
  1. /// <summary>
  2. /// 用户信息模型
  3. /// </summary>
  4. public class UserInfo
  5. {
  6. /// <summary>
  7. /// 键值
  8. /// </summary>
  9. public string Id { get; set; }
  10. /// <summary>
  11. /// 名字
  12. /// </summary>
  13. public string Name { get; set; }
  14. /// <summary>
  15. /// Person
  16. /// </summary>
  17. public PersonInfo Person { get; set; }
  18. }
  1. var userInfo = new UserInfo { Id = Guid.NewGuid().ToString(), Name = "3333" ,Person = new PersonInfo { Phone= "188****4444" } };
  2. .....
  3. // 带指定ID的创建对象
  4. var response = await esClient.CreateAsync(userInfo, idx => idx.Index(targetIndexName));
  5. var isSuccess = response.Result == Result.Created;

  1. PUT http://localhost:9200/demo_indexname/_create/1aa9de3f-f610-48d4-93fb-be41fbfd8987
  2. {"id":"1aa9de3f-f610-48d4-93fb-be41fbfd8987","name":"3333","person":{"phone":"188****4444"}}

查询带子结构文档

  1. // 基于LINQ模式查询带子结构文档
  2. var response = await esClient.SearchAsync<UserInfo>(s => s
  3. .Index(targetIndexName)
  4. .From(0)
  5. .Size(10)
  6. .Query(q => q.Term(t => t.Person.Phone, "188xxxxx0637"))
  7. );
  8. var userinfos = response.Documents;
  1. POST http://localhost:9200/demo_indexname/_search?typed_keys=true HTTP/1.1
  1. {
  2. "from": 0,
  3. "query": {
  4. "term": {
  5. "person.phone": {
  6. "value": "188xxxxx0637"
  7. }
  8. }
  9. },
  10. "size": 10
  11. }

附录

关于.Net Core使用Elasticsearch(俗称ES)、Kibana的研究说明的更多相关文章

  1. ASP.NET Core使用Elasticsearch记录NLog日志

    ASP.NET Core使用Elasticsearch记录NLog日志 1.新建一个 ASP.NET Core项目 2.安装Nuge包 运行:Install-Package NLog.Web.AspN ...

  2. [数据库]漫谈ElasticSearch关于ES性能调优几件必须知道的事(转)

    ElasticSearch是现在技术前沿的大数据引擎,常见的组合有ES+Logstash+Kibana作为一套成熟的日志系统,其中Logstash是ETL工具,Kibana是数据分析展示平台.ES让人 ...

  3. elasticsearch+logstash+redis+kibana 实时分析nginx日志

    1. 部署环境 2. 架构拓扑 3. nginx安装 安装在192.168.176.128服务器上 这里安装就简单粗暴了直接yum安装nginx [root@manager ~]# yum -y in ...

  4. (转)How to Use Elasticsearch, Logstash, and Kibana to Manage MySQL Logs

    A comprehensive log management and analysis strategy is vital, enabling organizations to understand ...

  5. docker-compose搭建单机多节点es + kibana

    docker-compose.yml配置如下: version: '2.2' services: elasticsearch: image: docker.elastic.co/elasticsear ...

  6. 漫谈ElasticSearch关于ES性能调优几件必须知道的事

    lasticSearch是现在技术前沿的大数据引擎,常见的组合有ES+Logstash+Kibana作为一套成熟的日志系统,其中Logstash是ETL工具,Kibana是数据分析展示平台.ES让人惊 ...

  7. Spring Cloud全链路追踪实现(Sleuth+Zipkin+RabbitMQ+ES+Kibana)

    简介 在微服务架构下存在多个服务之间的相互调用,当某个请求变慢或不可用时,我们如何快速定位服务故障点呢?链路追踪的实现就是为了解决这一问题,本文采用Sleuth+Zipkin+RabbitMQ+ES+ ...

  8. Elasticsearch集群+kibana

    目录: 软件及环境准备 JDK安装配置 ElasticSearch安装及配置 启动ES集群 es常规操作 安装及配置ES前端图形化操作工具 kibana汉化及时区修改 ElasticSearch和ki ...

  9. elasticsearch*3 + Es-Head + kibana Docker集群

    ES官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html   拉取docker镜像 dock ...

  10. Docker中Nginx,部署Tomcat,部署es + kibana,Docker的可视化,Commit镜像

    docker安装使用Nginx # 搜索信息 docker search nginx # 下载镜像 docker pull nginx # 运行测试 # --name给容器命名 # -p 宿主机端口: ...

随机推荐

  1. springboot+Thymeleaf+layui 实现分页

    layui分页插件 引入相关的js和css layui:css <link rel="stylesheet" th:href="@{layui/css/layui. ...

  2. 驰骋CCFlow开源工作流程引擎如何设置PDF打印

    前言 经常有驰骋CCFlow爱好者朋友提问关于打印相关问题.在这篇博文中大家介绍一下工作流引擎CCFlow的HTML打印和PDF打印,针对Java版本和.NET版本有不同的操作步骤,包括开关设置.水印 ...

  3. 在linux下把jsp文件 打包war格式(centos7)

    在linux下把jsp文件 打成war包 chmod -R 777 /data/jdk8u242-b08/bincd /data/TongWeb61712/deployment/TestCase//d ...

  4. python3.7[列表] 索引切片

    python3.7[列表] 索引  切片 排序     #### 列表.sort 永久排序   sorted(列表) 临时排序   ### >>> print(sorted(a))[ ...

  5. 1.4 重置root用户密码

    图1-45  系统的欢迎界面 1.4 重置root用户密码 平日里让运维人员头疼的事情已经很多了,因此偶尔把Linux系统的密码忘记了并不用慌,只需简单几步就可以完成密码的重置工作.但是,如果您是第一 ...

  6. K8s之二进制安装高可用集群

    1.环境准备 #二进制部署安装文档# https://github.com/easzlab/kubeasz/blob/master/docs/setup/00-planning_and_overall ...

  7. fragment textWatcher的设置位置

    override fun onStart() { super.onStart() Log.d("------------", "1") val titleWat ...

  8. 微信小程序使用同声传译实现语音识别功能

    我使用同声传译语音识别功能是为了实现微信小程序首页的语音搜索功能,如果你也是那么恭喜你,你可以ctrl+c.ctrl+v再改一改,如果你不是那么你也不要着急的走可以看完我的文章会对你有所帮助! 首先是 ...

  9. SpringMVC=>web.xml基本配置

    <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmln ...

  10. Python+selenium 自动化-启用带插件的chrome浏览器,调用浏览器带插件,浏览器加载配置信息。

    Python+selenium 自动化-启用带插件的chrome浏览器,调用浏览器带插件,浏览器加载配置信息.   本文链接:https://blog.csdn.net/qq_38161040/art ...