Elasticsearch第一篇
最近公司要做一个电商平台,所以就涉及到商品的搜索
1.为什么需要elasticsearch
1.1 响应速度
传统数据库MySQL
当数据库中的文档数仅仅上万条时,查询就比较慢了。如果一旦到企业级的数据 速度就会更加不可接受。
原因:
在数据库做模糊查询时,如LIKE语句,它会遍历整张表,同时进行字符串匹配。
例如,当小刘在数据库查询“市场”时,数据库会在每一条记录去匹配“市场”这两字是否出现。实际上,并不是所有记录都包含“市场”,所以做了很多无用功。
这两个步骤都不高效,而且随着数据量的增大,消耗的资源和时间都会线性的增长。
Elasticsearch
使用了es后,发现这个问题被很好解决,TB级数据在毫秒级就能返回检索结果,很好地解决了痛点。
原因:
而Elasticsearch是基于倒排索引的,例子如下。
当小刘搜索“手机”时,Elasticsearch就会立即返回文档F,G,H。这样就不用花多余的时间在其他文档上了,因此检索速度得到了数量级的提升
1.2 分词
MySQL
在做中文搜索时,发现组合词检索在数据库是很难完成的。
例如,当用户在搜索框输入“四川火锅”时,数据库通常只能把这四个字去进行全部匹配。可是在文本中,可能会出现“推荐四川好吃的火锅”,这时候就没有结果了。
原因:
数据库并不支持分词。如果人工去开发分词功能,费时费精力。
Elasticsearch
提升:
小刘使用云搜索服务后,就不用太过于关注分词了,因为Elasticsearch支持中文分词插件,很好地解决了问题。
原因:
当用户使用Elasticsearch时进行搜索时,Elasticsearch就自动帮他分好词了。
例如当小刘输入“四川火锅”时,Elasticsearch会自动做下面两件事
(1) 将“四川火锅”分词成“四川”和“火锅”
(2) 查找包含这两个词的文档
综上所述,我们可以知道es解决了哪些问题
1)检索相关数据;
2)返回统计结果;
3)速度要快
2 什么是elasticsearch
2.1 ES定义
ES=elaticsearch简写, Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。
Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
2.2 Lucene与ES关系?
1)Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。
2)Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
2.3 ES数据架构的主要概念(与关系数据库Mysql对比
(1)关系型数据库中的数据库(DataBase),等价于ES中的索引(Index)
(2)一个数据库下面有N张表(Table),等价于1个索引Index下面有N多类型(Type),
(3)一个数据库表(Table)下的数据由多行(ROW)多列(column,属性)组成,等价于1个Type由多个文档(Document)和多Field组成。
(4)在一个关系型数据库里面,schema定义了表、每个表的字段,还有表和字段之间的关系。 与之对应的,在ES中:Mapping定义索引下的Type的字段处理规则,即索引如何建立、索引类型、是否保存原始索引JSON文档、是否压缩原始JSON文档、是否需要分词处理、如何进行分词处理等。
(5)在数据库中的增insert、删delete、改update、查search操作等价于ES中的增PUT/POST、删Delete、改_update、查GET.
2.4 什么是elk
ELK=elasticsearch+Logstash+kibana
elasticsearch:后台分布式存储以及全文检索
logstash: 日志加工、“搬运工”
kibana:数据可视化展示。
ELK架构为数据分布式存储、可视化查询和日志解析创建了一个功能强大的管理链。 三者相互配合,取长补短,共同完成分布式大数据处理工作。
3 使用es
3.1 安装es 使用es肯定是需要安装的,由于用惯了docker,主要是因为我的好多软件都以及选择了docker。docker安装其实是很简单的,至于要一行命令即可。这里我选择的是es的7.2.0版本镜像镜像安装,具体安装命令如下:
docker pull elasticsearch:7.2.0
完命令以后回车,只需要等带镜像下载完成就可以了
3.2 启动es
安装完成以后当然需要去启动我们的es了,这里启动也是很方便的只需要一行命令即可。如下
docker run -d --name=es -e “ES_JAVA_OPTS=-Xms512m -Xmx512m” -p 9200:9200 -p 9300:9300 elaticsearch:7.2.0
这里直接复制,可能会报符号的错,把” 改为"
这里我报了个错 ERROR: [1] bootstrap checks failed
[1]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured
使用
find / -name elasticsearch.yml
找到/var/lib/docker…那个路径中的 elasticsearch.yml
往yml文件中添加下面的配置
node.name: node-1
cluster.initial_master_nodes: ["node-1"]
然后保存
这样es就启动好了。我们可以去检查es是否安装完成,可以输入命令
curl http://localhost:9200
或者在浏览器中打开http://es服务器地址:9200这个网址,如果能看到以下信息则说明我们的es是已经安装好了的。
{
“name” : “530dd7820315”,
“cluster_name” : “docker-cluster”,
“cluster_uuid” : “7O0fjpBJTkmn_axwmZX0RQ”,
“version” : {
“number” : “7.2.0”,
“build_flavor” : “default”,
“build_type” : “docker”,
“build_hash” : “508c38a”,
“build_date” : “2019-06-20T15:54:18.811730Z”,
“build_snapshot” : false,
“lucene_version” : “8.0.0”,
“minimum_wire_compatibility_version” : “6.8.0”,
“minimum_index_compatibility_version” : “6.0.0-beta1”
},
“tagline” : “You Know, for Search”
}
如果你是在服务器上安装,想要对外访问还必须打开你服务器的9200端口,然后将localhost换成你服务器的ip地址即可。如果是云服务器(我使用的是阿里云)注意去安全组中添加端口
3.3
es自带的分词器对中文分词不是很友好,所以我们下载开源的IK分词器来解决这个问题。首先进入到plugins目录中下载分词器,下载完成后然后解压,再重启es即可。具体步骤如下:
注意:elasticsearch的版本和ik分词器的版本需要保持一致
进入容器
docker exec -it es /bin/bash
选择目录
cd /usr/share/elasticsearch/plugins/
安装ik
elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.2.0/elasticsearch-analysis-ik-7.2.0.zip
退出容器
exit
重启容器
docker restart es
我这里使用上面这种方法报错,我使用的下面这种方法
1.在plugins目录下创建ik文件夹
2.下载对应es版本的ik分词器 下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
3.把下载好的zip包,使用
docker cp 下载的分词器 es:/usr/share/elasticsearch/plugins/ik/
4.
uzip 下载的ik分词器
5.docker restart es
4.使用kibana
4.1 docker安装kibana
docker pull kibana:7.2.0
4.2 启动kibana
安装完成以后需要启动kibana容器,连接到elasticsearch容器,命令如下
docker run --name kibana -e ELASTICSEARCH_URL=http://10.0.0.11:9200 -p 5601:5601 -d kibana:7.2.0
ELASTICSEARCH_URL后面是你自己的es地址
启动以后可以打开浏览器输入http://服务器地址:5601就可以打开kibana的界面了。
|----------------------------------------------------------|–|