elasticsearch-elasticsearch详解;安装部署(代码片段)

MinggeQingchun MinggeQingchun     2022-12-01     669

关键词:

一、结构化、半结构化、非结构化数据

在数据分析的过程中,我们会接触到很多的数据,这些数据根据结构分类可划分为三种:结构化数据、非结构化数据和半结构化数据。

1、结构化数据

结构化数据(简单来说就是数据库)一般是指可以使用关系型数据库表示和存储,结构化数据也称作行数据,可以用二维表来逻辑表达实现的数据。

一般特点是:数据以行为单位,一行数据表示一个实体的信息,每一行数据的属性是相同的,存储在数据库中;能够用数据或统一的结构加以表示,如数字、符号;能够用二维表结构来逻辑表达实现,包含属性和元组,如:员工基本信息:工号、姓名、性别、出生日期等等;员工信息就是属性,工号、姓名等就是其对应的元组

传统的关系数据模型、行数据,存储于数据库,可用二维表结构表示。而结构化的数据的存储和排列是很有规律的,这对查询和修改等操作很有帮助。

对于结构化数据来讲通常是先有结构再有数据,而对于半结构化数据来说则是先有数据再有结构。

2、半结构化数据

半结构化数据是结构化数据的一种形式,它并不符合关系型数据库或其他数据表的形式关联起来的数据模型结构,但包含相关标记,用来分隔语义元素以及对记录和字段进行分层,数据的结构和内容混在一起,没有明显的区分,因此,它也被称为自描述的结构,简单的说半结构化数据就是介于完全结构化数据和完全无结构的数据之间的数据。

如:HTML文档,JSON,XML和一些NoSQL数据库等就属于半结构化数据。

3、非结构化数据

非结构化数据顾名思义,就是没有固定结构的数据,数据结构不规则或不完整,没有预定义的数据模型,不方便用数据库二维逻辑表来表现的数据。

包括所有格式的办公文档、文本、图片、XML、HTML、各类报表、图像和音频/视频信息等等。对于这类数据,我们一般直接整体进行存储,而且一般存储为二进制的数据格式。

典型的人为生成的非结构化数据包括:

文本文件:文字处理、电子表格、演示文稿、电子邮件、日志。

社交媒体:来自新浪微博、微信、QQ、Facebook,Twitter,LinkedIn等平台的数据。

网站: YouTube,Instagram,照片共享网站。

移动数据:短信、位置等。

通讯:聊天、即时消息、电话录音、协作软件等。

媒体:MP3、数码照片、音频文件、视频文件。

业务应用程序:MS Office文档、生产力应用程序。

典型的机器生成的非结构化数据包括:

卫星图像:天气数据、地形、军事活动。

科学数据:石油和天然气勘探、空间勘探、地震图像、大气数据。

数字监控:监控照片和视频。

传感器数据:交通、天气、海洋传感器。

二、Elasticsearch 

Elastic Stack(也称为 ELK Stack)包括 Elasticsearch、Kibana、Beats 和 Logstash

Logstash 和 Beats 有助于收集、聚合和丰富数据并将其存储在 Elasticsearch 中

Kibana 使您能够以交互方式探索、可视化和分享对数据的见解,并管理和监控堆栈

Elasticsearch(简称ES) 是位于 Elastic Stack 核心的分布式搜索和分析引擎

Elasticsearch 是一个基于Apache Lucene(TM)的分布式、高扩展、高实时的RESTful风格的开源搜索与数据分析引擎

Elasticsearch 以其简单的 REST 风格 API、分布式特性、速度和可扩展性而闻名,是 Elastic Stack 的核心组件

Elastic Stack 是一套适用于数据采集、扩充、存储、分析和可视化的免费开源工具

Elasticsearch 能很方便的使大量数据具有搜索、分析和探索的能力;适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。

官网地址:

免费且开放的搜索:Elasticsearch、ELK 和 Kibana 的开发者 | Elastic

官网文档:

 Elasticsearch 是什么? | Elastic

GitHub地址:

 GitHub - elastic/elasticsearch: Free and Open, Distributed, RESTful Search Engine

1、Elasticsearch 用途

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

2、Elasticsearch 索引

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

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

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

3、Elasticsearch 工作原理

计算机 索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的 次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程

4、Elasticsearch 架构

架构主要自下而上包括以下几个部分:

1、Gateway 是最底层索引文件存储,支持多种类型的文件系统,包括本地文件系统、共享文件系统、HDFS 和 Amanzon S3

2、第二层是核心 Lucene 分词引擎,主要功能是进行分词和索引建立

3、第三层是 ES 自己的模块,包括集群节点发现,脚本支持模块和第三方插件模块

4、第四层是传输层,支持多种传输方式,包括 Thrift、HTTP、JMX 等

5、第五层是对外接口层,支持 RESTful API 交互方式和 Java API 两种方式

三、Elasticsearch 和 Solr

Lucene 是 Apache 软件基金会 Jakarta 项目组的一个子项目,提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在 Java 开发环境里 Lucene 是一个成熟的免费开源工具。就其本身而言,Lucene 是当前以及最近几年最受欢迎的免费 Java 信息检索程序库。但 Lucene 只是一个提供全文搜索功能类库的核心工具包,而真正使用它还需要一个完善的服务框架搭建起来进行应用。

目前市面上流行的搜索引擎软件,主流的就两款:Elasticsearch Solr。这两款都是基于 Lucene 搭建的,可以独立部署启动的搜索引擎服务软件。由于内核相同,所以两者除了服务器安装、部署、管理、集群以外,对于数据的操作 修改、添加、保存、查询等等都十分类似。 在使用过程中,一般都会将 Elasticsearch 和 Solr 这两个软件对比,然后进行选型。这两个搜索引擎都是流行的,先进的的开源搜索引擎。它们都是围绕核心底层搜索库 - Lucene 构建的。

Elasticsearch 和 Solr 都是开源搜索引擎

1、Google 搜索趋势结果表明,与 Solr 相比,Elasticsearch 具有很大的吸引力,但这并不意味着 Apache Solr 已经死亡。虽然有些人可能不这么认为,但 Solr 仍然是最受欢迎的搜索引擎之一,拥有强大的社区和开源支持

2、与 Solr 相比,Elasticsearch 易于安装且非常轻巧。可以在几分钟内安装并运行Elasticsearch。如果 Elasticsearch 管理不当,这种易于部署和使用可能会成为一个问题

基于 JSON 的配置很简单,但如果要为文件中的每个配置指定注释,那么它不适合。

总的来说,如果你的应用使用的是 JSON,那么 Elasticsearch 是一个更好的选择。否则,请使用 Solr,因为它的 schema.xml 和 solrconfig.xml 都有很好的文档记录

3、Solr 拥有更大,更成熟的用户,开发者和贡献者社区。ES 虽拥有的规模较小,但拥有活跃的用户社区以及不断增长的贡献者社区。

Solr 贡献者和提交者来自许多不同的组织,而 Elasticsearch 提交者来自单个公司

4、Solr 更成熟,但 ES 增长迅速,更稳定

5、Solr 是一个非常有据可查的产品,具有清晰的示例和 API 用例场景。 Elasticsearch 文档组织良好,但它缺乏好的示例和清晰的配置说明。

Elasticsearch 和 Solr选型

由于易于使用,Elasticsearch 在新开发者中更受欢迎。一个下载和一个命令就可以启动一切。

如果除了搜索文本之外还需要它来处理分析查询,Elasticsearch 是更好的选择

如果需要分布式索引,则需要选择 Elasticsearch。对于需要良好可伸缩性和以及性能分布式环境,Elasticsearch 是更好的选择

Elasticsearch 在开源日志管理用例中占据主导地位,许多组织在 Elasticsearch 中索引它们的日志以使其可搜索

如果你喜欢监控和指标,那么请使用 Elasticsearch,因为相对于 Solr,Elasticsearch 暴露了更多的关键指标

四、Elasticsearch 下载安装部署

下载地址

https://www.elastic.co/cn/downloads/past-releases#elasticsearch

博主这里下载的 elasticsearch-7.16.0 Windows版本(Elasticsearch 分为 Linux 和 Windows 版本,目前这里主要使用 Elasticsearch 的 Java 客户端的使用,所以安装较为简便的 Windows 版本) 

Windows版下载之后直接解压到目标目录下即可,目录结构如下:

bin :可执行脚本目录

config :配置目录

jdk:内置 JDK 目录(一般使用本地安装的JDK,不使用内置jdk)

lib:类库

logs:日志目录

modules:模块目录

plugins:插件目录

 启动成功输出日志如下

注:

1、Elasticsearch 是使用 java 开发的,7.16 版本的 ES 需要 JDK 版本 1.8 以上,默认安包带有 jdk 环境,如果系统配置 JAVA_HOME,那么使用系统默认的 JDK,如果没有配置使用自带的 JDK,一般建议使用系统配置的 JDK

2、9300 端口为 Elasticsearch 集群间组件的通信端口,9200 端口为浏览器访问的 http协议RESTful 端口

启动成功之后打开浏览器(推荐使用谷歌浏览器),访问  http://localhost:9200/

出现如下界面即可

五、踩坑

1、Windows安装Elasticsearch之后启动报错

Likely root cause: java.nio.file.FileAlreadyExistsException: xxxx\\elasticsearch-7.16.0\\config\\elasticsearch.keystore.tmp

D:\\SoftDevelopMentTools\\Elastic Search\\elasticsearch-7.16.0\\bin>elasticsearch
"warning: usage of JAVA_HOME is deprecated, use ES_JAVA_HOME"
Future versions of Elasticsearch will require Java 11; your Java version from [D:\\JDK\\java] does not meet this requirement. Consider switching to a distribution of Elasticsearch with a bundled JDK. If you are already using a distribution with a bundled JDK, ensure the JAVA_HOME environment variable is not set.
Future versions of Elasticsearch will require Java 11; your Java version from [D:\\JDK\\java] does not meet this requirement. Consider switching to a distribution of Elasticsearch with a bundled JDK. If you are already using a distribution with a bundled JDK, ensure the JAVA_HOME environment variable is not set.
Warning: with JDK 8 on Windows, Elasticsearch may be unable to derive correct
  ergonomic settings due to a JDK issue (JDK-8074459). Please use a newer
  version of Java.
Warning: MaxDirectMemorySize may have been miscalculated due to JDK-8074459.
  Please use a newer version of Java or set MaxDirectMemorySize explicitly.
Exception in thread "main" org.elasticsearch.bootstrap.BootstrapException: java.nio.file.FileAlreadyExistsException: D:\\SoftDevelopMentTools\\Elastic Search\\elasticsearch-7.16.0\\config\\elasticsearch.keystore.tmp
Likely root cause: java.nio.file.FileAlreadyExistsException: D:\\SoftDevelopMentTools\\Elastic Search\\elasticsearch-7.16.0\\config\\elasticsearch.keystore.tmp
        at sun.nio.fs.WindowsException.translateToIOException(Unknown Source)
        at sun.nio.fs.WindowsException.rethrowAsIOException(Unknown Source)
        at sun.nio.fs.WindowsException.rethrowAsIOException(Unknown Source)
        at sun.nio.fs.WindowsFileSystemProvider.newByteChannel(Unknown Source)
        at java.nio.file.spi.FileSystemProvider.newOutputStream(Unknown Source)
        at java.nio.file.Files.newOutputStream(Unknown Source)
        at org.apache.lucene.store.FSDirectory$FSIndexOutput.<init>(FSDirectory.java:410)
        at org.apache.lucene.store.FSDirectory$FSIndexOutput.<init>(FSDirectory.java:406)
        at org.apache.lucene.store.FSDirectory.createOutput(FSDirectory.java:254)
        at org.elasticsearch.common.settings.KeyStoreWrapper.save(KeyStoreWrapper.java:501)
        at org.elasticsearch.bootstrap.Bootstrap.loadSecureSettings(Bootstrap.java:272)
        at org.elasticsearch.bootstrap.Bootstrap.loadSecureSettings(Bootstrap.java:247)
        at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:364)
        at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:166)
        at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:157)
        at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:77)
        at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:112)
        at org.elasticsearch.cli.Command.main(Command.java:77)
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:122)
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:80)

Warning警告是使用 ES_JAVA_HOME 环境变量;以及未来ES版本建议使用Java 11版本 

解决办法

去对应目录下,删除elasticsearch.keystore.tmp 文件即可

2、加密文件的版本和jdk的版本加密文件不同

java.lang.SecurityException: The jurisdiction policy files are not signed by a trusted signer!

Caused by: java.lang.SecurityException: Can not initialize cryptographic mechanism
        at javax.crypto.JceSecurity.<clinit>(JceSecurity.java:93)
        ... 16 more
Caused by: java.lang.SecurityException: The jurisdiction policy files are not signed by the expected signer! (Policy files are specific per major JDK release.Ensure the correct version is installed.)

D:\\SoftDevelopMentTools\\Elastic Search\\elasticsearch-7.16.0\\bin>elasticsearch
"warning: usage of JAVA_HOME is deprecated, use ES_JAVA_HOME"
Future versions of Elasticsearch will require Java 11; your Java version from [D:\\JDK\\java] does not meet this requirement. Consider switching to a distribution of Elasticsearch with a bundled JDK. If you are already using a distribution with a bundled JDK, ensure the JAVA_HOME environment variable is not set.
Future versions of Elasticsearch will require Java 11; your Java version from [D:\\JDK\\java] does not meet this requirement. Consider switching to a distribution of Elasticsearch with a bundled JDK. If you are already using a distribution with a bundled JDK, ensure the JAVA_HOME environment variable is not set.
Warning: with JDK 8 on Windows, Elasticsearch may be unable to derive correct
  ergonomic settings due to a JDK issue (JDK-8074459). Please use a newer
  version of Java.
Warning: MaxDirectMemorySize may have been miscalculated due to JDK-8074459.
  Please use a newer version of Java or set MaxDirectMemorySize explicitly.
Exception in thread "main" java.lang.ExceptionInInitializerError
        at javax.crypto.SecretKeyFactory.nextSpi(SecretKeyFactory.java:295)
        at javax.crypto.SecretKeyFactory.<init>(SecretKeyFactory.java:121)
        at javax.crypto.SecretKeyFactory.getInstance(SecretKeyFactory.java:160)
        at org.elasticsearch.common.settings.KeyStoreWrapper.createCipher(KeyStoreWrapper.java:312)
        at org.elasticsearch.common.settings.KeyStoreWrapper.encrypt(KeyStoreWrapper.java:405)
        at org.elasticsearch.common.settings.KeyStoreWrapper.save(KeyStoreWrapper.java:516)
        at org.elasticsearch.bootstrap.Bootstrap.loadSecureSettings(Bootstrap.java:272)
        at org.elasticsearch.bootstrap.Bootstrap.loadSecureSettings(Bootstrap.java:247)
        at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:364)
        at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:166)
        at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:157)
        at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:77)
        at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:112)
        at org.elasticsearch.cli.Command.main(Command.java:77)
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:122)
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:80)
Caused by: java.lang.SecurityException: Can not initialize cryptographic mechanism
        at javax.crypto.JceSecurity.<clinit>(JceSecurity.java:93)
        ... 16 more
Caused by: java.lang.SecurityException: The jurisdiction policy files are not signed by the expected signer! (Policy files are specific per major JDK release.Ensure the correct version is installed.)
        at javax.crypto.JarVerifier.verifyPolicySigned(JarVerifier.java:336)
        at javax.crypto.JceSecurity.loadPolicies(JceSecurity.java:378)
        at javax.crypto.JceSecurity.setupJurisdictionPolicies(JceSecurity.java:323)
        at javax.crypto.JceSecurity.access$000(JceSecurity.java:50)
        at javax.crypto.JceSecurity$1.run(JceSecurity.java:85)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.crypto.JceSecurity.<clinit>(JceSecurity.java:82)
        ... 16 more

报错原因

主要是因为加密文件的版本和jdk的版本加密文件不相同

解决办法: 

查看主类(local_policy.jar,US_export_policy.jar)和jdk的加密文件的版本不相同

一般jdk 和 jre 默认安装路径 在

C:\\Program Files (x86)\\Java 下(或者Program Files目录),如

C:\\Program Files (x86)\\Java\\jdk1.6.0_39\\jre\\lib\\security

C:\\Program Files (x86)\\Java\\jre6\\lib\\security

但是博主是安装在 D盘 D:\\JDK\\ 下

因此替换D盘中

D:\\JDK\\jdk\\jre\\lib\\security

D:\\JDK\\java\\lib\\security

 local_policy.jar,US_export_policy.jar 文件

local_policy.jar,US_export_policy.jar 文件下载地址如下: 

 JCE8: JCE Unlimited Strength Jurisdiction Policy Files for JDK/JRE 8 Download

JCE7: Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 7 Download

JCE6: Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 6

JCE5-1.4:Java Archive Downloads - Java Platform Technologies

可参考

JAVA刚碰见的问题( java.lang.SecurityException: The jurisdiction policy files are not signed by a trusted s_Just call ant的博客-CSDN博客