days04-初识ES-比较mysql之间的异同、并安装ES、kibana以及IK分词器的学习心得

本人是在小破站上一步一步的学习,学到了第四天的课程,所以想着将学习总结发布一下,之前的学习也会后续补上!

视频链接:04-初识ES-es与mysql的概念对比_哔哩哔哩_bilibili

文件获取:链接:https://pan.baidu.com/s/1BInIJD2KokL0WSA30PG-1Q 
                  提取码:qa7s

一、初始elasticsearch

        1.1 了解es

          什么是elasticsearch?

elasticsearch是一款非常强大的开源搜索引擎,可以帮助我们从海量数据中快速找到搜索的内容

elasticsearch结合kibana、Logstash、Beats,也就是elastic stack(ELK)。被广泛应用在日志数据分析、实时监控等领域。

 

 elasticsearch是elastic stack的核心,负责存储、搜索、分析数据。

        elasticsearch的发展

 Lucene是一个Java语言的搜索引擎类库,是Apache公司的顶级项目,由DougCutting于1999年研发。官网地址:https://lucene.apache.org/

Lucene的优势:

  •  易扩展
  • 高性能(基于倒排索引)

Lucene的缺点:

  • 只限于Java语言开发
  • 学习曲线陡峭
  • 不支持水平扩展

2004年Shay Banon基于Lucene开发了Compass 2010年Shay Banon 重写了Compass,取名为Elasticsearch。 官网地址: https://www.elastic.co/cn/

目前最新的版本是:7.12.1

相比与lucene,elasticsearch具备下列优势:

  • 支持分布式,可水平扩展
  • 提供Restful接口,可被任何语言调用

总结: 

        什么是elasticsearch?

一个开源的分布式搜索引擎,可以用来实现搜索、日志统计、分析、系统监控等功能。

        什么是elastic stack(ELK)?

是以elasticsearch为核心的技术栈,包括beats、Logstash、kibana、elasticsearch。

        什么是Lucene?

是Apache的开源搜索引擎类库,提供了搜索引擎的核心API。

        1.2 倒排索引

        正向索引和倒排索引的区别

传统数据库(如MySQL)采用正向索引,例如给下表(tb_goods)中的id创建索引:

正向索引:在搜索“手机”时会按照id一条一条的搜索,看看所有行数据的title那一条包含手机关键字,当面对海量的数据时,会显得耗时长,性能性对于es来说较差。

反向索引:比如说在搜索“华为手机”时,他会将其分成两个词条也就是‘华为’、‘手机’,然后在词条列表查询文档id,最后根据文档id查询文档,将其存入结果集。

倒排索引中包含两部分内容:

  •  词条词典(Term Dictionary):记录所有词条,以及词条与倒排列表(Posting List)之间的关系,会给词条创建索引,提高查询和插入效率
  • 倒排列表(Posting List):记录词条所在的文档id、词条出现频率 、词条在文档中的位置等信息 文档id:用于快速获取文档 词条频率(TF):文档在词条出现的次数,用于评分。

 总结:

        什么是文档和词条?

  • 每一条数据就是一个文档
  • 对文档中的内容分词,得到的词语就是词条

        什么是正向索引?

基于文档id创建索引。查询词条时必须先找到文档,而后判断是否包含词条

        什么是倒排索引?

对文档内容分词,对词条创建索引,并记录词条所在文档的信息。查询时先根据词条查询到文档id,而后获取到文档

        1.3 es的一些概念

        文档

elasticsearch是面向文档存储的,可以是数据库中的一条商品数据,一个订单信息。 文档数据会被序列化为json格式后存储在elasticsearch中。

         索引(index):相同类型的文档的集合

        映射(mapping):索引中文档的字段约束信息,类似表的结构约束        

将上面凌乱的文档信息按照相同类型即索引分成以下三个索引

 

         MySQL与es的概念对比

         架构

Mysql:擅长事务类型操作,可以确保数据的安全和一致性

Elasticsearch:擅长海量数据的搜索、分析、计算

         总结:

文档:一条数据就是一个文档,es中是Json格式

字段:Json文档中的字段 索引:同类型文档的集合

映射:索引中文档的约束,比如字段名称、类型

elasticsearch与数据库的关系:

  • 数据库负责事务类型操作
  • elasticsearch负责海量数据的搜索、分析、计算

        1.4 安装es、kibana

安装kibana:可以很好的编写DSL语句

        部署单点es——创建网络

因为我们还需要部署kibana容器,因此需要让es和kibana容器互联。这里先在虚拟机的centos服务器上创建一个网络:

docker network create es-net

        部署单点es——加载镜像

这里采用elasticsearch的7.12.1版本的镜像,这个镜像体积非常大,接近1G。不建议大家自己pull。直接拷贝我发的压缩包就行。在xshell软件上利用 'rz' 命令将压缩包进行上传。

Xshell如何与虚拟机进行连接以及如何下载安装虚拟机并且建立centos服务器如果有感兴趣的后面会单独出一期。。。

//对上传的压缩包进行加载
docker load -i es.tar 
docker load -i kibana.tar 

         部署单点es——运行

运行docker命令,部署单点es:

docker run -d \   //-d:后台运行
	--name es \   // 顾名思义  起个名字给容器
    -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \   // -e 环境变量的配置
    -e "discovery.type=single-node" \       // 运行模式为单点运行,如果集群运行的话 这么需要修改
    -v es-data:/usr/share/elasticsearch/data \   // -v :数据卷挂载
    -v es-plugins:/usr/share/elasticsearch/plugins \
    --privileged \
    --network es-net \  //将es容器加到es-net网络中
    -p 9200:9200 \   //-p暴露端口,9200暴露的http端口供用户使用,9300 各个节点互联的端口
    -p 9300:9300 \
elasticsearch:7.12.1   //镜像名称
docker ps  //查看当前运行的容器

 当出现和我一样的结果时,说明容器创建成功!

 在浏览器输入http://本机ip:9200/  如果显示下面的json数据 则es安装成功!(9200之前的为自己的IP地址,可以输入ip addr 查看)

         部署kibana:

kibana可以给我们提供一个elasticsearch的可视化界面,便于我们学习。

        部署(和es命令类似)

运行docker命令,部署kibana

docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \ //设置elasticsearch的地址,因为kibana已经与
//elasticsearch在一个网络,因此可以用容器名直接访问elasticsearch
--network=es-net \  //加入一个名为es-net的网络中,与elasticsearch在同一个网络中
-p 5601:5601  \ //端口映射配置
kibana:7.12.1 //一定要与es的版本保持一致

 kibana启动一般比较慢,需要多等待一会,可以通过命令:

docker logs -f kibana

查看运行日志,当查看到下面的日志,说明安装成功成功: 

 也可以输入http://本地ip:5601/查看可视化界面

kibana——DevTools

kibana中提供了一个DevTools界面:

下面这个界面中可以编写DSL来操作elasticsearch。并且对DSL语句有自动补全功能。

安装IK分词器的原因

es在创建倒排索引时需要对文档分词;在搜索时,需要对用户输入内容分词。但默认的分词规则对中文处理并不友好。我们在kibana的DevTools中测试:

POST /_analyze  //请求方式+请求路径,这里省略了http://本机ip:9200,有kibana帮我们补充

{
  "analyzer": "standard",  //standard为默认分词器
  "text": "黑马程序员学习java太棒了!"
}

 会发现得到的结果它在分词时,英文分的还可以,中文的话是逐一分词,对我们查找文档信息不是很友好,这样的话比如说搜索“手机”关键词时,它将包含手或者机的都搜索出来了,但是结果并不是我们想要的。。。

分词器

处理中文分词,一般会使用IK分词器。https://github.com/medcl/elasticsearch-analysis-ik

ik分词器包含两种模式:

  • ik_smart:最少切分,粗粒度
  • ik_max_word:最细切分,细粒度

安装IK分词器——安装ik插件(在线较慢)

# 进入容器内部
docker exec -it elasticsearch /bin/bash

# 在线下载并安装
./bin/elasticsearch-plugin  install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip

#退出
exit
#重启容器
docker restart elasticsearch

安装IK分词器——离线安装ik插件(推荐)

        1)查看数据卷目录

安装插件需要知道elasticsearch的plugins目录位置,而我们用了数据卷挂载,因此需要查看elasticsearch的数据卷目录,通过下面命令查看:

docker volume inspect es-plugins

显示结果:

 说明plugins目录被挂载到了:/var/lib/docker/volumes/es-plugins/_data

        2)上传到es容器的插件数据卷中

也就是 /var/lib/docker/volumes/es-plugins/_data

首先cd 到该目录下然后利用xftp7传输文件到该目录

        3)重启容器

docker restart es

# 查看es日志
docker logs -f es

查看日志发现已经加载成功!

        4)测试:

IK分词器包含两种模式:

  • `ik_smart`:最少切分

  • `ik_max_word`:最细切分

可以试着自己运行一下,就能看出两者之间的差别,最细切分不仅将原句中的“黑马程序员”分成了“黑马”、“程序员”并且将“程序员”分成了“程序"、”员“。

分词少的话自然占有内存就会少,然后存放的总数据信息也会丰富增多。

ik_max_word  自然而然占有内存会多,即缺点,但是搜索精度高。

      这个话用的时候就看个人需求咯!!!

但是,如果最近的流行词出现了,这个分词器还能不能适用呢,接下来我们测试一下!

 会发现并没有达到我们期望的目标,说明分词器本身的字典中并没有这种新型词汇,那么该怎么解决呢?

解决方案:拓展ik分类器中的词库

    1)拓展ik分词器的词库,只需要修改一个ik分词器目录中的config目录中的IkAnalyzer.cfg.xml文件:

    2)然后在名为ext.dic的文件中,添加想要拓展的词语即可:

奥力给

 当我们想将字典中的一些词停用可以这样做:

要禁用某些敏感词条,只需要修改一个ik分词器目录中的config目录中的IkAnalyzer.cfg.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
        <comment>IK Analyzer 扩展配置</comment>
        <!--用户可以在这里配置自己的扩展字典-->
        <entry key="ext_dict">ext.dic</entry>
         <!--用户可以在这里配置自己的扩展停止词字典  *** 添加停用词词典-->
        <entry key="ext_stopwords">stopword.dic</entry>
</properties>

 然后在名为stopword.dic的文件中,添加想要拓展的词语即可:



修改完成以后记得重启一下:

docker restart es

 最后我们测试一下,发现修改成功!

 

以上的话就是这次的学习总结,希望能有所帮助!

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值