ElasticSearch入门
1、ElasticSearch介绍
1.1 引言
在海量数据中执行搜索功能时,如果使用MSQL,效率太低。
如果关键字输入的不准确一样可以搜索到想要的数据。
将搜索关键字,以高亮字体展示(购物网站)。
1.2 ES的介绍
ES是一个使用Java语言并且基于lucence编写的搜索引擎框架,他提供了分布式的全文搜索功能,提供了一个统一的基于RESTful风格的WEB接口。官方文档
lucence:一个搜索引擎底层,官方网站,apache旗下的顶级项目,直接使用成本太高,所以采用ES实现功能。
分布式:突出ES的横向扩展能力。
全文检索:将一段词语进行分词,并将分出的单个词语统一的放在一个分词库中,在搜索时,根据关键字取分词库中检索,找到匹配的内容(倒排索引)。
比如:淘宝搜索“壳手机”,将其分解为“壳”、“手机”、“手”等;将目标“…苹果手机壳…”也这样分解。(全文检索)
RESTful风格的WEB接口:操作ES,只需要发送一个http请求,并且根据请求方式的不同,携带参数的不同,执行相应的功能。
应用广泛:WIKI,Github,Gold Man用ES每天维护将近10TB数据。
1.3 ES的由来
回忆时光
许多年前,一个刚结婚的名叫 Shay Banon 的失业开发者,跟着他的妻子去了伦敦,他的妻子在那里学习厨师。 在寻找一个赚钱的工作的时候,为了给他的妻子做一个食谱搜索引擎,他开始使用 Lucene 的一个早期版本。
直接使用 Lucene 是很难的,因此 Shay 开始做一个抽象层,Java 开发者使用它可以很简单的给他们的程序添加搜索功能。 他发布了他的第一个开源项目 Compass。
后来 Shay 获得了一份工作,主要是高性能,分布式环境下的内存数据网格。这个对于高性能,实时,分布式搜索引擎的需求尤为突出, 他决定重写 Compass,把它变为一个独立的服务并取名 Elasticsearch。
第一个公开版本在2010年2月发布,从此以后,Elasticsearch 已经成为了 Github 上最活跃的项目之一,他拥有超过300名 contributors(目前736名 contributors )。 一家公司已经开始围绕 Elasticsearch 提供商业服务,并开发新的特性,但是,Elasticsearch 将永远开源并对所有人可用。
据说,Shay 的妻子还在等着她的食谱搜索引擎…
1.4 ES和Slor
Solr在查询死数据时,速度比ES快。但是数据如果是改变的,Solr查询速度会降低很多,ES的查询速度没有变化。
Solr搭建集群依赖ZooKeeper来帮助管理,ES本身就支持集群的搭建,不需要第三方的介入。
Solr出现早,最开始Solr的社区很火爆,针对国内文档少;ES出现后,国内社区火爆程度 上升,ES的文档非常健全。
ES对云计算和大数据支持很好
1.5 倒排索引
拿到数据的过程分两步:(关键字:“好编程“,分词为”好“和”编程“)
- query:根据输入的关键字,去分词库中检索内容;结果:1,2,3
- fetch:根据在分词库中检索到的id,直接拉取指定数据;结果:“1:你好”,“2:编程”和“3:你好编程”
将存放的数据以一定的方式进行分词,并将分词的内容存放到一个单独的分词库中。
当用户取查询数据时,会将用户的查询关键字进行分词。
然后去分词库中匹配内容,最终得到数据的id标识
根据id标识去存放数据的位置拉去指定数据
2、安装
2.1 安装docker-compose
2.2.1 安装方法1,使用pip
安装pip需要先安装epel-release包
1
$ yum -y install -y epel-release
安装pip
1
$ yum install -y python-pip
检查python和pip版本
1
2$ python -V # 3+
$ pip -V # 20+若不满足上述条件
pip升级
1
$ pip install --upgrade pip -ihttp://pypi.douban.com/simple --trusted-host pypi.douban.com
升级python2到python3
1
2
3
4
5
6
7
8
9
10
11# 下载
$ wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz
# 解压源码包
$ tar -zxvf Python-3.7.0.tgz
# 创建安装目录
$ mkdir /usr/local/python3
$ cd Python-3.7.0/
# 安装到指定目录
$ ./configure --prefix=/usr/local/python3
# 编译
$ make && make install设置软链接全局使用python3
1
2
3
4$ cd /usr/local/python3
$ ln -s /usr/local/python3/bin/python3 /usr/local/bin/python3
$ ln -s /usr/local/python3/bin/pip3 /usr/local/bin/pip3
$ ln -s /usr/local/bin/pip3 /usr/bin/pip验证版本
1
2
3
4$ python3 -V
Python 3.7.0
$ pip -v
pip 20.2.2 from /usr/local/python3/lib/python3.7/site-packages/pip (python 3.7)可以使用下述命令来查看软链接设置
1
$ ls -al /usr/bin | grep python
升级 Python 之后,由于将默认的 python 指向了 python3,yum 不能正常使用,需要编辑 yum 的配置文件:
1
2
3
4$ vi /usr/bin/yum
将 #!/usr/bin/python 改为 #!/usr/bin/python2.7
$ vi /usr/libexec/urlgrabber-ext-down
将 #!/usr/bin/python 改为 #!/usr/bin/python2.7
指定安装源,安装docker-compose
1
$ pip install -i https://pypi.tuna.tsinghua.edu.cn/simple docker-compose
查看docker-compose的版本
1
2$ docker-compose -v
docker-compose version 1.24.0, build 0aa5906
2.1.2 安装方法2,离线安装(推荐)
Github发行版本,下载docker-compose-Linux-x86_64
,推荐一个软件Motrix
,加快下载速度,将下载文件命名为docker-compose
。
上传到服务器并移动到
/usr/local/bin/
:1
$ mv docker-compose /usr/local/bin/
添加可执行权限
1
$ chmod +x /usr/local/bin/docker-compose
查看docker-compose版本
1
2$ docker-compose -v
docker-compose version 1.26.2, build eefe0d31
2.2 安装ElasticSearch&Kibana
Docker镜像工厂,分别搜索“elasticsearch”和“kibana”,选取“社区镜像”作为来源,找到“library/elasticsearch”和“library/kibana”,版本同一。
Kibana是为Elasticsearch设计的开源分析和可视化平台。
在指定文件夹下:
1
$ vi docker-compose.yml
并复制下面内容到docker-compose.yml文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18version: "3.1"
services:
elasticsearch:
image: daocloud.io/library/elasticsearch:6.5.4
restart: always
container_name: elasticsearch
ports:
- 9200:9200
kibana:
image: daocloud.io/library/kibana:6.5.4
restart: always
container_name: kibana
ports:
- 5601:5601
environment:
- elasticsearch_url=ip:9200 # 此处ip为自己对应主机地址
depends_on:
- elasticsearch运行
1
$ docker-compose up -d
查看日志
1
$ docker-compose logs -f
浏览器查看,成功
2.3 安装IK分词器
Es默认的分词器对中文的支持是不友好的,Github下载地址,版本还是要统一。
还是使用docker安装:
查看es容器的CONTAINER ID,进入es容器内部:
1
2[root@localhost docker_elasticsearch]# docker exec -it <CONTAINER ID> bash
[root@fddcec4fe9e7 elasticsearch]#进入bin目录,执行bin目录下的脚本文件:
1
$ cd bin
IK分词器对于es来说就是一个插件:
1
2
3$ ./elasticsearch-plugin install
https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.5.4/
elasticsearch-analysis-ik-6.5.4.zip由于在容器内安装IK分词器,如果把容器
down
掉,这个IK分词器就没了,重启就可以了记得重启es容器,分词器才会生效,重启es就可以了:
1
$ docker restart <CONTAINER ID>
在Kibana中测试,使用GitHub推荐方法;在Dev Tool中:
1
2
3
4
5POST _analyze
{
"ik_max_word", :
"我是Java工程师.你呢?" :
}得到输出“
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60{
"tokens" : [
{
"token" : "我",
"start_offset" : 0,
"end_offset" : 1,
"type" : "CN_CHAR",
"position" : 0
},
{
"token" : "是",
"start_offset" : 1,
"end_offset" : 2,
"type" : "CN_CHAR",
"position" : 1
},
{
"token" : "java",
"start_offset" : 2,
"end_offset" : 6,
"type" : "ENGLISH",
"position" : 2
},
{
"token" : "工程师",
"start_offset" : 6,
"end_offset" : 9,
"type" : "CN_WORD",
"position" : 3
},
{
"token" : "工程",
"start_offset" : 6,
"end_offset" : 8,
"type" : "CN_WORD",
"position" : 4
},
{
"token" : "师",
"start_offset" : 8,
"end_offset" : 9,
"type" : "CN_CHAR",
"position" : 5
},
{
"token" : "你",
"start_offset" : 10,
"end_offset" : 11,
"type" : "CN_CHAR",
"position" : 6
},
{
"token" : "呢",
"start_offset" : 11,
"end_offset" : 12,
"type" : "CN_CHAR",
"position" : 7
}
]
}