学习黑马- SpringCloud微服务技术栈项目的分布式搜索章节自行整理的笔记,方便日后的重构。
项目涉及技术
1.知识点是按照集数依次整理,方便日后回来查找。
2.考虑到不是固定的联网方式,时而WiFi,时而热点,配置静态IP会导致每次网络变更后都需要重新配置,所以虚拟机使用的动态路由,当需要运行相关程序时,IP变化,只需要修改测试时初始化的RestHighLevelClient
即可。
3.将代码路径列举主要是为后续审查。
4.RestClient操作索引库的代码路径E:\微服务\实用篇\day05-Elasticsearch01\资料\hotel-demo
。
实用篇
1.ES==elasticsearch–开源分布式搜索引擎。(P77)
2.elasticsearch:用来实现搜索、日志统计、分析、系统监控等功能。
3.elasticsearch+kibana、Logstash、Beats == elastic stack(ELK)。
4.elasticsearch–核心-存储、计算、搜索数据;可替换组件–kibana - 数据可视化;可替换组件–Logstash、Beats - 数据抓取。
5.Lucene–Apache的搜索引擎类库-易扩展、高性能、基于倒排索引-提供搜索引擎核心API-仅支持Java语言。
6.数据库表–文档:每一条数据就是一个文档;词条:对文档中的内容分词,得到的词语就是词条。
7.正向索引–基于文档id创建索引;查询词条时必须先找到文档,然后判断是否包含词条 - 数据库的模糊查询-逐条查询判断。
8.倒排索引–对文档内容分词,对词条创建索引,并记录词条所在文档的id;查询是先根据词条查询文档id,而后获取文档。
9.ES–存储-面向文档存储的,文档数据会被序列化为JSON格式;索引-相同类型的文档的集合;映射-索引中文档的字段约束信息,类似表的结构约束。
10.MySQL与elasticsearch的概念对比、架构分析、关系。(P80)
11.安装部署es、kibana,需要先让es和kibana容器互联,部署单点es或kibana都是运行上传的tar包将数据导入,再运行docker命令,即可访问,具体的命令整理如下,外加注释,清晰明了。
# 创建网络 docker network create es-net # 关闭虚拟机后,查看局域网络(已配置过,重启后不影响) docker network ls # 导入数据 docker load -i es.tar # 运行docker命令,部署单点es docker run -d \ --name es \ -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \ -e "discovery.type=single-node" \ -v es-data:/usr/share/elasticsearch/data \ -v es-plugins:/usr/share/elasticsearch/plugins \ --privileged \ --network es-net \ -p 9200:9200 \ -p 9300:9300 \ elasticsearch:7.12.1 # 重启后,重启容器 docker start es # 输入地址加端口即可访问es http://192.168.226.139:9200 # 导入数据 docker load -i kibana.tar # 运行docker命令,部署kibana docker run -d \ --name kibana \ -e ELASTICSEARCH_HOSTS=http://es:9200 \ --network=es-net \ -p 5601:5601 \ kibana:7.12.1 # 重启后重启容器 docker start kibana # 输入地址加端口即可访问kibana http://192.168.226.139:5601
ps:(1)重启后只需要重启容器即可;(2)如果没有删除容器,重新运行docker命令部署会报名字重复错误;(3)如果不删除容器,想修改名称创建容器的话,需要在ess和kibana中的请求连接要同步,否则会报Kibana server is not ready yet的问题。
1.分词器的作用–创建倒排索引时对文档分词、用户搜索时,对输入的内容分词。(P83)
2.测试分词器、安装IK分词器。
# 在kibana中测试分词器 # english-默认分词器、standard-标准分词器 POST /_analyze { "text": "好好学习,天天向上", "analyzer": "english" } # 安装ik分词器 # 查看数据卷elasticsearch的plugins目录位置 docker volume inspect es-plugins # 到这个目录下 cd /var/lib/docker/volumes/es-plugins/_data # 上传elasticsearch-analysis-ik-7.12.1.zip,然后解压 unzip elasticsearch-analysis-ik-7.12.1.zip # 不太建议上面的方式,我试过发现启动会报错,后面改了很久都是报错,不知道哪里的配置文件被修改了,然后恢复快照重新来过 # 使用FileZillar直接传输Windows下解压的文件夹,结果是成功的 # 重启es容器 docker restart es # 查看es日志 docker logs -f es # 测试ik分词器 # IK分词器包含两种模式 # ik_smart:最少切分 -- 被搜索的概论低-粗粒度 # ik_max_word:最细切分 -- 内存占用高-细粒度 GET /_analyze { "analyzer": "ik_max_word", "text": "好好学习天天向上,奥利给,噢噢点赞" }
- 1.ik分词器-扩展词库、停用词库。
注意当前文件的编码必须是 UTF-8 格式,严禁使用Windows记事本编辑
# 打开IK分词器config目录,在IKAnalyzer.cfg.xml配置文件内容添加 # 用户可以在这里配置自己的扩展字典 <entry key="ext_dict">ext.dic</entry> #用户可以在这里配置自己的扩展停止词字典 *** 添加停用词词典 <entry key="ext_stopwords">stopword.dic</entry> # 新建一个 ext.dic,可以参考config目录下复制一个配置文件进行修改 奥利给 # 在 stopword.dic 添加停用词 噢噢 # 修改过看效果,重启es容器即可 docker restart es # 查看 日志 docker logs -f es
1.索引库操作(P85)
2.mapping属性–mapping是对索引库中文档的约束。
3.mapping属性包括:type:字段数据类型、index:是后创建索引-默认为true;analyzer:使用哪种分词器;properties:该字段的子字段。
4.type简单类型–字符串:text(可分词的文本)、keyword(精确值);数值:long、integer、short、byte、double、float;布尔:boolean;日期:date;对象:object。
5.创建索引库、查看索引库、删除索引库、禁止修改索引库。(P86)
# DSL语法 # 创建索引库名 PUT /索引库名 # 创建索引库的DSL语法例子 PUT /a { "mappings": { "properties": { "info": { "type": "text", "analyzer": "ik_smart" }, "name":{ "type": "object", "properties": { "firstName": { "type": "keyword", "index": false } } } } } } # 查看索引库 GET /索引库名 # 删除索引库 DELETE /索引库名 # 索引库和mapping一旦创建就无法修改,但是可以添加新的字段 PUT /索引库名/_mapping { "properties":{ "新字段名":{ "type":"integer" } } }
- 1.文档操作–插入文档、查看文档、删除文档(P88)
- 2.修改文档–全量修改,会删除旧文档,添加新文档;局部修改,修改指定字段值。
# 插入文档 POST /索引库名/_doc/文档id # 查看文档 GET /索引库名/_doc/文档id # 删除文档 DELETE /索引库名/_doc/文档id # 插入的DSL语法例子 -- 索引库名与上方创建相同 POST /a/_doc/1 { "info": "好好学习天天向上", "name": { "firstName": "小", "lastName": "盈" } } # 修改文档 -- 全量修改,会删除旧文档,添加新文档 PUT /索引库名/_doc/文档id PUT /a/_doc/1 { "info": "好好学习天天向上", "email": "45543563.qq.com", "name": { "firstName": "小", "lastName": "盈" } } # 局部修改,修改指定字段值 -- 只能修改一个指段 POST /索引库名/_update/文档id POST /a/_update/1 { "doc":{ "email": "xiaoying@qq.com" } }
1.RestClient操作索引库(P90)
2.导入hotel-demo,分析hotel的mapping数据结构-字段名、数据类型、是否参与搜索、是否分词、分词器。
3.tip:ES中支持两种地理坐标数据类型–geo_point:由维度和经度确定的一个点;geo_shape:有多个geo_point组成的复杂几何图形。
4.字段拷贝可以使用copy_to属性将当前字段拷贝到指定字段。
5.创建索引库、删除索引库、判断索引库是否存在。
6.索引库操作基本步骤:初始化RestHighLevelClient;创建XxxIndexRequest。xxx是Create、Get、Delete;准备DSL(Crete时需要);发送请求,调用RestHighLevelClient#indices().xxx()方法。
# 酒店的mapping PUT /hotel { "mappings":{ "properties":{ "id":{ "type": "keyword" }, "name":{ "type": "text", "analyzer": "ik_max_word", "copy_to": "all" }, "address":{ "type": "keyword", "index": false }, "price":{ "type": "integer" }, "score":{ "type": "integer" }, "brand":{ "type": "keyword", "copy_to": "all" }, "city":{ "type": "keyword" }, "starName":{ "type": "keyword" }, "business":{ "type": "keyword", "copy_to": "all" }, "location":{ "type": "geo_point" }, "pic":{ "type": "keyword", "index": false }, "all":{ "type": "text", "analyzer": "ik_max_word" } } } }
1.RestClient操作文档–利用JavaRestClient实现文档的CRUD。(P95)
2.在数据库查询酒店数据,导入到hotel索引库,实现酒店数据的CRUD。
3.新增文档-index、根据id查询文档-get、根据id修改文档-update、根据id删除文档-delete。
4.文档操作的基本步骤:初始化RestHighLevelClient;创建XxxRequest;准备参数(Index和Update时需要);发送请求,调用RestHighLevelClient#.xxx()方法;解析结果(Get时需要)。
5.利用JavaRestClient批量导入酒店数据到ES。
->微服务技术栈分布式搜索课程视频
https://www.bilibili.com/video/BV1LQ4y127n4?p=77&vd_source=d3e01a57b1e96968088fe21f334a1693
<-
记录每一个学习瞬间