谷粒商城-高级-35 全文检索 Elasticsearch-基础及使用 Docker 安装

一、ElasticSearch简介

简介

Elasticsearch 是一个分布式搜索服务,适用于所有类型的数据,包括文本、数字、地理空间、结构化和非结构化数据。它可以快速的存储、搜索和分析海量数据。提供Restful API,底层基于Lucene,采用多shard(分片)的方式保证数据安全,并且提供自动resharding的功能,github等大型的站点也是采用了ElasticSearch作为其搜索服务。

用途:检索,日志处理和分析,基础设施指标和容器监测,安全分析,业务分析等。

基本概念

ES和Mysql 进行类比

1、Index(索引)

动词,相当于MySQL中的 insert;
名词,相当于MySQL中的 Database;

2、Type(类型)

在 Index(索引)中,可以定义一个或多个类型。
类似于 MySQL中的 Table;每一种类型的数据放在一起。

3、Document(文档)

保存在某个索引(index)下,某种类型(Type)的一个数据(Document),文档是 JSON 格式的,Document就是MySQL中的某个 Table 里面的内容;

类似关系:

  • 索引---数据库
  • 类型---表
  • 文档---表中的记录
  • 属性---列

file

4、倒排索引机制

分词:将整句分拆为单词,在检索的时候然后会给每个记录做相关性得分,然后从高到低情况排除给出。

二、Docker安装ES

1、下载镜像文件

sudo docker pull elasticsearch:7.4.2   # 存储和检索数据
sudo docker pull kibana:7.4.2     # 可视化检索数据

在安装的时候看一下虚拟机内存是否够用,ES非常的吃内存。

free -m

2、创建实例

切换到root用户

su root
> vagrant

2.1、ElasticSearch

创建配置文件目录,将docker内部es的配置文件挂载到外部,方便修改。

mkdir /mydata/elasticsearch/config
mkdir /mydata/elasticsearch/data

# 任何IP都可以访问,注意host和IP中间有空格
echo "http.host: 0.0.0.0" >>/mydata/elasticsearch/config/elasticsearch.yml

创建好目录之后,需要给该目录访问、执行的权限:

chmod -R 777 /mydata/elasticsearch/

运行镜像:

#运行ES
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms128m -Xmx256m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.4.2

与ES交互的端口说明:

  • 9200端口

    ​ RESTful API通过HTTP通信

  • 9300端口

    ​ Java客户端与ES的原生传输协议和集群交互

ES_JAVA_OPTS指定java虚拟机相关参数

  • -Xms128m 初始堆内存大小为128m
  • -Xmx256m 最大堆内存大小为256m
  • discovery.type=single-node 设置为单点启动

ES默认占内存很大,默认占2G,所以,一般在启动时需要指定固定的内存大小,这里我们设置为 128M。

启动之后,可以查看docker 的ES进程:

[root@localhost mydata]# docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                                            NAMES
b9c6d899522a        elasticsearch:7.4.2   "/usr/local/bin/dock…"   33 seconds ago      Up 11 seconds       0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   elasticsearch

docker启动时加载出现了问题,使用 docker logs 查看启动日志:

2020-08-23 15:57:39,546 main ERROR No Log4j 2 configuration file found. Using default configuration (logging only errors to the console), or user programmatically provided configurations. Set system property 'log4j2.debug' to show Log4j 2 internal initialization logging. See https://logging.apache.org/log4j/2.x/manual/configuration.html for instructions on how to configure Log4j 2
Exception in thread "main" SettingsException[Failed to load settings from [elasticsearch.yml]]; nested: ParsingException[Failed to parse object: expecting token of type [START_OBJECT] but found [VALUE_STRING]];
    at org.elasticsearch.common.settings.Settings$Builder.loadFromStream(Settings.java:1097)
    at org.elasticsearch.common.settings.Settings$Builder.loadFromPath(Settings.java:1070)
    ···
Caused by: ParsingException[Failed to parse object: expecting token of type [START_OBJECT] but found [VALUE_STRING]]
    at org.elasticsearch.common.xcontent.XContentParserUtils.ensureExpectedToken(XContentParserUtils.java:78)
    at org.elasticsearch.common.settings.Settings.fromXContent(Settings.java:617)
    ... 8 more

根据错误分析原来是配置文件[elasticsearch.yml] 的host和IP中间没有空格:

echo "http.host:0.0.0.0" >>/mydata/elasticsearch/config/elasticsearch.yml
echo "http.host: 0.0.0.0" >>/mydata/elasticsearch/config/elasticsearch.yml

然后通过浏览器访问ES:http://192.168.10.10:9200/

file

2.2、Kibana

docker run --name kibana -e ELASTICSEARCH_URL=192.168.10.10:9200 -p 5601:5601 \
-d kibana:7.4.2

http://192.168.10.10:9200 一定要改为自己ES虚拟机的地址。

查看是否运行成功:

[root@localhost config]# docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                                            NAMES
fbd8372062fc        kibana:7.4.2          "/usr/local/bin/dumb…"   2 minutes ago       Up 2 minutes        0.0.0.0:5601->5601/tcp                           kibana
b9c6d899522a        elasticsearch:7.4.2   "/usr/local/bin/dock…"   27 hours ago        Up 13 minutes       0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   elasticsearch
[root@localhost config]#

访问kibana报这样的错:

Reporting plugin self-check failed. Please check the Kibana Reporting settin

修改 es配置文件config/elasticsearch.yml,修改项如下:

cluster.name: my-application
http.host: 0.0.0.0
xpack.license.self_generated.type: basic

进入容器内部:

docker exec -it fbd8 /bin/bash

kibana 配置文件

bash-4.2$ pwd
/usr/share/kibana/config
bash-4.2$ vi kibana.yml

修改kibana.yml配置文件:

#
# ** THIS IS AN AUTO-GENERATED FILE **
#

# Default Kibana configuration for docker target
server.name: kibana
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: [ "http://192.168.10.10:9200" ]
xpack.monitoring.ui.container.elasticsearch.enabled: true

然后重启Kibana,可以看到,已经可以正常访问了哈~

file

3、设置开机自启动

docker是安装在虚拟机上的,我们希望在虚拟机自启动docker时,docker里边的ES,Kibana容器也可以自启动,那么需要设置开机自启动:

先查容器的container ID:

[root@localhost config]# docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                                            NAMES
fbd8372062fc        kibana:7.4.2          "/usr/local/bin/dumb…"   4 hours ago         Up 3 hours          0.0.0.0:5601->5601/tcp                           kibana
b9c6d899522a        elasticsearch:7.4.2   "/usr/local/bin/dock…"   31 hours ago        Up 4 hours          0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   elasticsearch

设置开机自启动:

docker update fbd8 --restart=always  # kibana
docker update b9c6 --restart=always  # elasticsearch

为者常成,行者常至