ElasticSearch(一)【基础安装与入门】

发布于:2024-07-11 ⋅ 阅读:(27) ⋅ 点赞:(0)

前言

        不少岗位的技能要求都有 elasticsearch(ES),包括实习的公司也在使用 elasticsearch 建立索引,所以这里需要好好学习一下。大数据的技术是学不完的,不能追求了解所有框架,把最基础的学好才是最重要的。比如 Hadoop ,尽管没人会使用 MapReduce 做数据处理,但是这种设计思想在很多大数据框架中都会有体现,所以很有必要深入学习;再比如 2PC协议、WAL在Zookeeper、Kafka、Flink、PostGreSQL、Greenplum 这些分布式框架中都是会用到的。

1、ElasticSearch

        早期我们的搜索引擎在做全文检索时使用的是 SQL(like %xxx%),但是大数据场景下这种效率是非常低的,即使通过索引优化也是达不到大数据的一个处理要求的,所以我们很有必要学习这么一个分布式全文检索引擎。

1.1、Doug Cutting

  • 2000年,Doug Cutting 用 Java 开发了 Lucene,目标是为了各种中小型应用软件加入全文检索功能;
  • 2002年,Doug Cutting 又在 Lucene 的基础上开发出了 Nutch;
  • 2003年,谷歌发表了 GFS;2004年,Doug Cutting 基于该论文实现了 NDFS;
  • 2005年,Doug Cutting 又基于 MapReduce,在 Nutch 搜索引擎实现了 MapReduce。
  • 2006年,Doug Cutting 加入了雅虎,并将NDFS和MapReduce进行了升级改造,重命名为 Hadoop(NDFS 改名为 HDFS)。同年谷歌又发表了 BigTable,于是 Doug Cutting 又实现了 HBase;
  • 2008年1月,Hadoop正式成为 Apache 顶级项目,同年 2 月,雅虎将自己搜索引擎部署在了上面。

ElasticSearch 是基于 Lucene 做了进一步的封装和增强;

1.2、ElasticSearch 概述

        ElasticSearch,简称es,es是一个开源的高拓展分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es 也使用 java开发并使用 Lucene 作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API (同一个请求路径,不同的请求方式)来隐藏 Lucene 的复杂性,从而让全文搜索变得简单。维基百科、Stack Overflow、Github 以及国内很多电商网站、招聘网站等都在使用 ElasticSearch 做数据搜索引擎。

1.3、windows安装

下面用到的安装包建议从镜像下载:

Index of elasticsearch-local

Index of kibana-local

Releases · infinilabs/analysis-ik · GitHub

1.3.1、安装 ElasticSearch

解压 ElasticSearch

双击bin目录下的 elasticsearch.bat 启动: 

 启动后访问本地的 9200 端口:

1.3.2、安装 elasticsearch-head-master

解压 elasticsearch-head-master

在 elasticsearch-head-master 目录下的 cmd 窗口安装依赖:

# 一切的前提是要有 Node.JS 环境
# 用 npm install 可能比较慢,cnpm 需要单独安装
cnpm install

启动 elasticsearch-head-master:

 解决跨域问题(在yml文件中配置):

# 解决跨域问题
http.core.enabled: true
http.core.allow-origin: "*"

重启访问:

1.3.3、安装 kibana

解压后直接点击 bin 目录下的 kibana.bat:

点击开发者工具(扳手标志):

这和我实习公司的 ES 配置界面差不多

汉化(在 kibana.yml 中配置):

i18n.locale: "zh-CN"

重启 kibana:

 1.4、ElasticSearch 核心概念

elasticsearch 是面向文档,在 es 中,一切都是 json!

关系型数据库 ElasticSearch
数据库(database) 索引(indices)
表(table) types(过时)
行(row) documents
字段(columns) fields

ElasticSearch(集群)中可以包含多个索引(数据库),每个索引中可以包含多个类型(表),每个类型下又包含多个文档(行),每个文档中又包含多个字段(列)。

物理设计

ElasticSearch在后台把每个索引划分成多个分片,每个分片可以在集群中的不同服务端间迁移;

逻辑设计

一个索引类型中,包含多个文档,比如说文档1、文档2。当我们索引一篇文档时,可以通过这样的顺序找到它:索引>类型>文档id,通过这个组合我们就能索引到某个具体的文档,注意:id不必是整数,实际上它是字符串;

文档

之前说ElasticSearch是面向文档,那么就意味着索引和搜索数据的最小单位是文档,ElasticSearch中,文档有几个重要属性:

  • 自我包含,一篇文档中同时包含字段和对应的值,也就是同时包含key-value;
  • 可以是层次型的;
  • 灵活的结构,文档不依赖预先定义的模式;

尽管我们可以随意的新增或者忽略某个字段,但是,每个字段的类型非常重要,比如一个年龄字段类型,可以是字符,也可以是整型,因为ES会包含字段和类型之间的映射及其他的设置,这种映射具体到每个映射的每种类型,这也是为什么在ES中,类型有时候也称为映射类型。

类型

        类型是文档的逻辑容器,就像关系型数据库一样,表格是行的容器。类型中对于字段的定义称为映射,比如name映射为字符串类型,我们说文档是无模式的,他们不需要拥有映射中所定义的所有字段,比如新增一个字段,那么ES是怎么做的呢?ES会自动将新字段加入映射,但是这个字段不确定它是什么类型,ES就开始猜,如果这个值是18,那么ES就会认为它是整形,但是ES也可能猜不对,所以最安全的方式就是提前定义好所需要的映射,这点跟关系型数据库殊途同归了,先定义好字段,然后再使用。

索引

就是数据库!

索引是映射类型的容器,ES中的索引是一个非常大的文档集合,索引存储了映射类型的字段和其他设置,然后它们被存储到了各个分片上。

物理设计:节点与分片如何工作

一个集群至少有一个节点,而一个节点就是一个ES进程,节点可以有多个索引。如果你创建索引,那么索引默认会有5个分片(primary shard,又称主分片)构成的,每一个主分片会有一个副本(又称复制分片);

上面是一个有3个节点的集群,可以看到主分片和对应的复制分片都不会在同一个节点内,这样有利于某个节点挂掉了,数据也不至于丢失,实际上,一个分片是一个Lucene索引,一个包含倒排索引的文件目录,倒排索引的结构使得ES在不扫描全部文档的情况下,就能告诉你哪些文档包含特定的关键字。

倒排索引

ES使用的是一种称为倒排索引的结构,采用Lucene倒排索引作为底层。这种结构适用于快速的全文搜索,一个索引由文档中所有不重复的列表构成,对于每一个词,都有一个包含它的文档列表,例如,现在有两个文档,每个文档包含如下内容:

现在我们试图搜索to forever,只要查到包含每个词条的文档

1.5、IK 分词器

分词:即把一段中文或者别的划分成一个个的关键字,我们在搜索时候会把自己的信息进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一个匹配操作,默认的中文分词是将每个字看成一个词,比如“我爱学习”会被分为“我“,”爱“,”学“”,“习”,这显然是不符合要求的,所以我们需要安装中文分词器ik来解决这个问题。(就像我们之前 python 重点 jiaba 库)

IK提供了两个分词算法:ik_smartik_max_word,其中 ik_smart 为最少切分,ik_max_word 为最细粒度划分!

安装 IK 分词器

将解压后的所有文件放到 es 的 plugins 目录下(建议创建一个名为 ik 的父目录,不然 es 识别不了启动会闪退)

重启 es、kibana

ik_smart 算法测试

ik_max_word 算法测试

自定义字典

对于一些特别的词,需要我们自己加入到词库里,比如一些热梗

编辑自己的字典(在上面的 config 目录下创建 lyh.dic,输入一行 "鸡你太美"):

编辑保存后重启 es 和 kibana

再次测试:

可以看到, 这次我们成功把原本词库中没有但是我们自定义添加的词识别出来了。