分布式搜索--elasticsearch

学习黑马- 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配置文件内容添加
# 用户可以在这里配置自己的扩展字典
ext.dic
#用户可以在这里配置自己的扩展停止词字典  *** 添加停用词词典
stopword.dic

# 新建一个 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": "[email protected]"
	}
}
  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

<-

记录每一个学习瞬间

你可能感兴趣的:(分布式,elasticsearch,java)