ElasticSearch 学习(一)—— ElasticSearch 基础


前言

ElasticSearch 简单基础知识。

提示:以下是本篇文章正文内容,下面案例可供参考

一、全文检索基础

1.1 什么是全文检索

将非结构化的数据中的一部分信息提取出来,重新组织,使其变得有一定的结构,然后对这些具有一定结构的数据进行搜索,从而达到搜索相对较快的目的。这部分从非结构化数据中提取出来,然后重新组织的信息,就叫做索引

例如:字典。字典的拼音表和部首检字表就相当于字典的索引。对每一个字的解释都是非结构化的。如果字典没有音节表和部首检字表,在茫茫辞海中找到一个字只能顺序扫描,然而字的某些信息可以提取出来进行结构化处理,比如读音,就比较结构化,分声母和韵母,可以一一列举,于是将读音拿出来按照一定的顺序排列,每一项读音都指向此字的详细解释的页数。我们搜索时按结构化的拼音搜索到读音,然后按照其指向的页数,就可以找到我们的非结构化数据,也就是对这个字的解释。这种先建立索引,再对索引进行搜索的过程就叫做全文索引(Full-text Search)。

创建索引的过程非常耗时,但是索引一旦创建就可以多次使用,并且全文缩影的主要处理的就是查询,所以消耗时间创建索引是很值得的。

1.2 全文检索流程

请添加图片描述

1.3 概念

1.3.1 索引库

索引库就是存储索引,并保存在磁盘上的一系列文件。里面存储了建立好的索引信息以及文档对象。请添加图片描述
一个索引库相当于数据库中的一张表;

1.3.2 document 对象

可以理解成数据表中的一行记录。创建索引时,我们需要将原始内容创建成文档(document),文档中包括一个一个的域(Field),在域中存储内容。每个文档都有一个位移的编号,相当于 ID。请添加图片描述
一个文档相当于表中的一条记录(也就是说,我们将一段原始内容,读取然后拆分(分词)成一个一个的片段,存储在一个一个的 Field 中,所有的 Field 的集合就是我们所说的文档,对应我们的关系型数据库中的表数据,就是一个表中的一条数据);

1.3.3 field 对象

当我们把 document 看做数据库中的一条数据的话,field 相当于是记录中的字段。field 是索引库中存储数据的最小单位。field 的数据类型大致可以分为数值类型文本类型,一般需要查询的字段都是文本类型的。field 的基本属性如下:

  1. 是否分词:是对域的内容进行分词处理。前提是我们要对域的内容进行查询(有使用才需要分词,用不到的话,进行分词就是浪费时间和效率了);
  2. 是否索引:将 Field 分析后的词或者整个 Field 值进行索引,只有索引才可以搜索到(就像字典的拼音表,不可能在里面查到字典中汉字的具体释义);
    • 比如,商品名称、商品简介分析后进行索引,订单号、身份证号不用分词,但是也要进行索引化,因为这些条件,将来都可以作为我们的查询条件。
  3. 是否存储:将 Field 中的值存储在文档中,存储在文档中的 Field 中才可以从我们的文档 document 中获取到;
    • 比如,商品名称、订单号,凡是可能需要从文档 document 中获取的 Field 都要存储起来,才可以被获取到。

1.3.4 Term 对象

从文档对象中拆分出来的词,每一个都是一个 Term,不同的域(Field)拆分出来的词都是不同的 Term,比如 1.3.1 中的索引库,里面有 Filename:spring 和 Content:spring,如果对这两个域进行分词,那么拆分出来的词都是 spring,但是这两个 spring 是两个不同的 Term;因为,Term 中会包含两部分内容,一部分是文档的域名,另一部分就是词的内容,
Term 是创建索引的关键词对象。

2 ElasticSearch 简介

2.1 说明

ElasticSearch 简称 ES,ES 是基于 Lucene 一个开源的高扩展的分布式全文检索引擎。他可以近乎试试的存储和检索数据,其本身的拓展性极好,可以拓展到上百台服务器(他的内部有集群的维护和协调的平台,不需要引入其他的管理中心,如 Zookeeper),可以处理 PB 级别的数据。ES 使用 Java 开发,并且使用 Lucene 作为其核心来实现所有的索引和搜索的功能。但是,这样做的目的是通过简单的 RESTful API 来隐藏 Lucene 的复杂性,从而降低全文搜索的难度。

2.2 产品案例

  • 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 构建挖财⾃⼰的⽇志采集和分析体系

2.3 与 Solr 比较

  • Solr 利用 Zookeeper 进行分布式管理,而 ElasticSearch 自带有分布式协调管理平台;
  • Solr 支持更多格式的数据,而 ElasticSearch 仅支持 json 文件格式;
  • Solr 官方提供的功能更多,而 ElasticSearch 本身更注重核心功能,高级功能多由第三方插件提供;
  • Solr 在传统的搜索应用中 表现好于 ElasticSearch,但是在处理实时搜索应用时,效率明显的低于 ElasticSearch。

3 ElasticSearch 相关概念(术语)

3.1 概述

ElasticSesrch 是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document)。然而它不仅仅是存储,还会索引(index)每个文档的内容,使之可以被搜索,在 ElasticSearch 中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序和过滤。ElasticSearch 与传统关系型数据库对比如下:
Relational DB --> Databases --> Tables --> Rows --> Columns
ElasticSearch --> Indices(索引) --> Types --> Documents --> Fields

3.2 核心概念

3.2.1 索引 index

一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须为全小写字母),并且当我们要对这个用印中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。在一个集群中,可以定义任意多的索引。

3.2.2 类型 type

在一个索引中,可以定义一种或多种类型。一个类型就是我们的索引的一个逻辑上的分类/分区,其语义完全由我们自己定。通常,会为具有一组共同字段的文档定义一个类型;比如,假设运营一个博客平台并且将所有的数据存储到一个索引中。在这个索引中,我们可以为用户定义一个类型,为博客数据定义另一个类型,当然,如果有需要,我们也可以为评论数据定义另一个类型。

3.2.3 字段 Field

相当于是数据表的字段,对文档数据根据不同属性进行的分类标识。

3.2.4 映射 mapping

mapping 是处理数据的方式和规则的一些限制,如某个字段的数据类型、默认值、分析器、是否被索引等等,这些都是映射里面可以设置的。其它就是处理 ES 里面数据的一些使用规则设置也叫做映射,按照最优规则处理数据对性能的提高很大,因此就需要建立映射,并且需要思考如何建立映射才能对性能更友好。

3.2.5 文档 document

一个文档是一个可被索引的基础信息单元。比如,你可以拥有一个客户的文档,某一产品的一个文档;当然,也可以拥有某个订单的一个文档。文档以 JSON 的格式来表示。而 JSON 是一个处处存在的互联网数据交互格式。

在一个 index/type 里面,你可以存储任意多的文档。尽管一个文档,在物理上存在于一个索引之中,但是,文档必须被索引赋予一个索引的type。

3.2.6 接近实时 NRT

Elasticsearch 是⼀个接近实时的搜索平台。这意味着,从索引⼀个⽂档直到这个⽂档能够被搜索到有⼀ 个轻微的延迟(通常是1秒以内) 。

3.2.7 集群 cluster

一个集群就是由一个或多个节点转移至在一起,他们共同持有整个的数据,并一起提供索引和搜索功能。一个集群由一个唯一的名字标识,默认是 “elasticsearch” 。这个名字很重要,因为一个节点只能通过指定某个集群的名字来加入这个集群。

3.2.8 节点 node

一个节点是集群中的一个服务器,作为集群的一部分,它存储数据、参与集群的索引和搜索功能。和集群类似,一个节点也有一个名字来表示,默认情况下,这个名字是一个随机的漫威漫画角色的名字。这个名字会在启动的时候赋予节点。这个名字对于管理工作来说挺重要的,因为在这个管理过程中,我们会去确定网络中的那些服务器对应于 ElasticSearch 集群中的那些节点。
一个节点可以通过配置集群的方式加入到一个指定的集群中。默认情况下,每个节点都会被安排加入到一个 “elasticsearch” 的集群中。
在一个集群里,只要我们愿意,就可以拥有任意多个节点。而且,如果当前你的网络中没有运行任何 ElasticSearch 节点。这时你启动一个节点,会默认创建并加入一个叫 “elasticsearch” 的集群。

3.2.9 分片和复制(shards & replicas)

一个索引可以存储查过单个节点硬件限制的大量数据。比如,一个具有 10 亿文档的索引占据 1TB 的磁盘空间,而任一节点都没有这样大的磁盘空间;或者的那个节点处理搜索请求,相应太慢。为了解决这个问题, ElasticSearch 提供了将索引划分成多份的能力,划分出来的这些碎片就叫做分片。当我们创建爱你一个索引的时候,我们可以指定想要的分片的数量,每个分片本身也是一个功能完善且独立的索引,这个索引可以被放置到集群中的任何节点上。分片很重要,这是因为:

  1. 允许我们水平分割,拓展我们的内存容量;
  2. 允许我们在分片(潜在的、位于多个节点上)之上进行分布式的、并行的操作,进而提高性能(吞吐量)。

至于一个分片怎样分布,它的文档怎样聚合回搜索请求,是完全由 ElasticSearch 管理的,对于用户来说,这些都是透明(不可见)的。

在一个网络(云)的环境里,失败随时都可能发生,某个分片(节点)不知道什么情况下就离线或者消失。这种情况下,有一个故障转移机制是非常有用且强烈推荐的。为此,ElasticSearch 允许创建分片的一个或多个拷贝,这些拷贝叫做复制分片或复制。
复制之所以重要,是因为:① 在分片(节点)失败的情况下,提供了高可用性,拓展搜索(吞吐)量,因此,需注意复制分片从不与源分片置于置于同一节点。搜索可以在所有的复制上并行运行,每个索引可以被分成多个分片,一个索引也可以被复制 0 次(没有复制)或者复制多次,一旦被复制,那么,每个索引就有了主分片(作为复制源的分片)和复制分片(拷贝件)的区别。分片和复制的数量可以在索引创建的时候指定,在索引创建之后,也可以随时随地的动态改变复制的数量。但是事后不能修改分片数量。

默认情况下,ElasticSearch 中的美国人索引都会被分片为 5 个主分片和 1 个复制(每个主分片都有一个复制分片),这就意味着,我们的索引将会有 5 个主分片和 5 个复制分片(1份完全拷贝)。这样的话,每个索引总共就有 10 个分片。

4 ElasticSearch 安装

我们通过 docker 容器来安装 ElasticSearch 。

4.1 下载镜像

# 获取5.6.8版本镜像
docker pull elasticsearch:5.6.8

镜像比较大 570M。请添加图片描述

4.2 创建运行容器

docker run -di --name=c_es -p 9200:9200 -p 9300:9300 elasticsearch:5.6.8

请添加图片描述

ElasticSearch会对外开放两个端口:

  1. 9200:Web端的管理平台端口;
  2. 9300:服务的默认端口,服务对外暴露的接口。

请添加图片描述

4.3 开启远程访问

在 ElasticSearch 之后,我们并不能正常使用,因为自从5.x 版本以后,ElasticSearch 默认不开启远程连接,程序会直接报错请添加图片描述
因此我们需要手动开启,开启过程如下:

  1. 进入我们的容器
docker exec -it c_es /bin/bash

请添加图片描述

  1. 进入之后,我们会看到一个 config 目录,我们 ElasticSearch 的配置文件就在这个目录下:
    请添加图片描述

  2. 在容器中安装 vi 命令
    ElasticSearch 的镜像中没有 vim 或 vi 命令,所以,就需要我们手动安装:

    ● 设置 apt 下载源;
    容器原生的下载源是在外网上的,速度会很慢,甚至是连不上,所以我们把这个设置成我们国内的:
    手动添加源文件 sources.list:

# deb cdrom:[Ubuntu 16.04 LTS _Xenial Xerus_ - Release amd64 (20160420.1)]/ xenial main restricted
deb-src http://archive.ubuntu.com/ubuntu xenial main restricted #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse #Added by software-properties
deb http://archive.canonical.com/ubuntu xenial partner
deb-src http://archive.canonical.com/ubuntu xenial partner
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse

● 把源文件从本地复制到容器中

docker cp ~/sources.list c_es:/etc/apt/sources.list

● 安装 vim 编辑器

apt-get update
apt-get install vim
  1. 修改 elasticsearch.yml 配置文件
    在这里插入图片描述
  2. 修改本机配置文件
    在修改完容器之中的东西后,退出容器,修改本地的一些配置信息。因为, ElasticSearch 在启动的时候会进行一些检查,比如做多能打开多少文件、虚拟内存区域数量等等。当我们放开这些配置,同时也意味着要打开更多的文件以及虚拟内存。所以我们还需要进行系统调优:

修改vi /etc/security/limits.conf ,追加内容 (nofile是单个进程允许打开的最⼤⽂件个数 soft nofile 是 软限制 hard nofile是硬限制 )

* soft nofile 65536
* hard nofile 65536

修改vi /etc/sysctl.conf,追加内容 (限制⼀个进程可以拥有的VMA(虚拟内存区域)的数量 )

vm.max_map_count=655360

执⾏下⾯命令 修改内核参数马上⽣效

sysctl -p

重启电脑:

reboot 
  1. 跨域配置
    修改容器中的配置文件 elasticsearch/config 下的配置⽂件:elasticsearch.yml,增加以下三句命令,并重启
http.cors.enabled: true
http.cors.allow-origin: "*"
network.host: 192.168.291.128 # 你的ip

其中:

  • http.cors.enabled: true:此步为允许elasticsearch跨域访问,默认是false。
  • **http.cors.allow-origin: “*”:**表⽰跨域访问允许的域名地址(表⽰任意)。

然后重启容器。

设置容器开启自启动的命令

docker update --restart=always 容器名称或者容器id

5 ElasticSearch 客户端操作

在我们的实际开发中,作为 ElasticSearch 服务的客户端的形式主要有三种:

  1. elasticsearch-header 插件;
  2. 使用 elasticsearch 提供的 RESTful 接口直接访问;
  3. 使用 elasticsearch 提供的 API 进行访问(代码调用)。

5.1 elasticsearch-head

ElasticSearch 不同于 Solr 自带图形化界面,我们可以通过安装 ElasticSearch 的 head 插件,完成图形化界面的效果,完成索引数据的查看。安装插件的方式有两种,在线安装和本地安装,我们用的是本地安装。 elasticsearch-5-* 以上版本安装 head 需要安装 node 和 grunt 。

  1. 下载 head 插件,下载链接 ElasticSearch Head插件下载;
  2. 将elasticsearch-head-master压缩包解压到任意⽬录(最好不要有中文、空格以及特殊符号),但是要和elasticsearch的安装⽬录区别开 。
  3. 下载nodejs:Node.js 下载地址
  4. 将 grunt 安装为全局命令, Grunt 是基于 Node.js 的项目构建工具。构建命令:
cnpm install -g grunt-cli

请添加图片描述
5. 进入刚刚解压的 elasticsearch-head-master 目录,开始启动 head:

cnpm install

请添加图片描述

grunt server

在这里插入图片描述
通过浏览器访问:请添加图片描述
PS:如果访问不到,大概率是因为跨域访问配置的有问题,请参考 4.3 中的远程访问的跨域访问重新进行配置。

5.2 使用 Postman工具进行 RESTful 接口访问

5.2.1 ElasticSearch 接口语法

curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'

说明:
在这里插入图片描述

5.2.2 创建索引 index 和 mapping

请求 uri:

http://192.168.191.128:9200/blog1

请求体:

{
	"mappings": {
		"article": {
			"properties": {
				"id": {
					"type": "long",
					"store": true,
					"index": "not_analyzed"
				},
				"title": {
					"type": "text",
					"store": true,
					"index": "analyzed",
					"analyzer": "standard"
				},
				"content": {
					"type": "text",
					"store": true,
					"index": "analyzed",
					"analyzer": "standard"
				}
			}
		}
	}
}

Postman 截图:请添加图片描述
elasticsearch-head查看: 请添加图片描述

5.2.3 创建索引后设置 mapping

我们可以在创建索引时设置 mapping 信息,当然也可以先创建索引,然后设置mapping,我们在 5.2.2 中没有设置 mapping 信息,直接使用 PUT 类型的方法,创建了一个索引,然后再设置 mapping 信息;
然而,创建 mapping 的方式如下

请求 url:

http://192.168.191.128:9200/blog1/hello/_mapping

请求体:

{
	"hello": {
		"properties": {
			"id": {
				"type": "long",
				"store": true
			},
			"title": {
				"type": "text",
				"store": true,
				"index": true,
				"analyzer": "standard"
			},
			"content": {
				"type": "text",
				"store": true,
				"index": true,
				"analyzer": "standard"
			}
		}
	}
}

Postman 截图:
请添加图片描述

5.2.4 删除索引 index

注意的是,删除的请求类型是 DELETE ,请求的 url 和 创建的 url 一模一样。

请求 url:

http://192.168.191.128:9200/blog1

Postman 截图:
请添加图片描述
请添加图片描述

5.2.5 创建文档 document

请求 url :

http://192.168.191.128:9200/blog1/1

请求体:

{
	"id": 1,
	"title": "ElasticSearch是⼀个基于Lucene的搜索服务器",
	"content": "它提供了⼀个分布式多⽤户能⼒的全⽂搜索引擎,基于RESTful web接⼝。Elasticsearch是⽤ Java开发的, 并作为Apache许可条款下的开放源码发布, 是当前流⾏ 的企业级搜索引擎。 设计⽤ 于云计算中, 能够达到实时搜索, 稳定, 可靠, 快速, 安装使⽤⽅ 便。 "
}

postman 截图:
请添加图片描述
elasticsearch-head查看:
请添加图片描述

5.2.6 修改文档 document

请求路径的中的 article 参数表示了document 的类型,若是不加,那么 ElasticSearch 就认为数据类型是紧跟着的url中的参数 1

请添加图片描述
请求 url :

http://192.168.191.128:9200/blog1/article/1

请求体:

{
	"id": 1,
	"title": "【再修改】ElasticSearch是⼀个基于Lucene的搜索服务器",
	"content": "【再修改】它提供了⼀个分布式多⽤户能⼒的全⽂搜索引擎,基于RESTful web接⼝。Elasticsearch是⽤ Java开发的, 并作为Apache许可条款下的开放源码发布, 是当前流⾏ 的企业级搜索引擎。 设计⽤ 于云计算中, 能够达到实时搜索, 稳定, 可靠, 快速, 安装使⽤⽅ 便。 "
}

postman 截图:请添加图片描述

5.2.7 删除文档 document

请求 url :

http://192.168.191.128:9200/blog1/article/1

postman 截图:
请添加图片描述
ElasticSearch 查看:
请添加图片描述

5.2.8 查询文档

5.2.8.1 根据 id 查询

请求url:

http://192.168.191.128:9200/blog1/article/1

postman 截图:请添加图片描述

5.2.8.2 querystring查询

就是根据内容查询;

请求 url:

http://192.168.191.128:9200/blog1/article/_search

请求体:

{
	"query": {
		"query_string": {
			"default_field": "title",
			"query": "搜索服务器"
		}
	}
}

响应体:

{
    "took": 24,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 1,
        "max_score": 1.3143302,
        "hits": [
            {
                "_index": "blog1",
                "_type": "article",
                "_id": "1",
                "_score": 1.3143302,
                "_source": {
                    "id": 1,
                    "title": "ElasticSearch是⼀个基于Lucene的搜索服务器",
                    "content": "它提供了⼀个分布式多⽤户能⼒的全⽂搜索引擎,基于RESTful web接⼝。Elasticsearch是⽤ Java开发的, 并作为Apache许可条款下的开放源码发布, 是当前流⾏ 的企业级搜索引擎。 设计⽤ 于云计算中, 能够达到实时搜索, 稳定, 可靠, 快速, 安装使⽤⽅ 便。 "
                }
            }
        ]
    }
}

postman 截图:请添加图片描述
注意:
将搜索内容"搜索服务器"修改为"钢索",同样也能搜索到⽂档,该原因会在下⾯讲解中得到答案

{
	"query": {
		"query_string": {
			"default_field": "title",
			"query": "钢索"
		}
	}
}

钢索 -> “钢”, “索”,搜索是分成两个词,注意Standard标准分词器,会把汉字每个字⼀个词 存到索引库中的tilte,也是按照Standard进⾏的分词 所以搜索钢索能搜到这个 document 。

5.2.8.3 term 查询

请求 url :

http://192.168.191.128:9200/blog1/article/_search

请求体:

{
	"query": {
		"term": {
			"title": "搜索"
		}
	}
}

请添加图片描述

  • query_string:搜索之前对搜索的关键词分词;
  • term:对搜索的关键词不分词。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值