目录
2.安装数据可视化界面 elasticsearch head
一、什么是Elasticsearch
Elasticsearch,简称为 ES,是一款非常强大的开源的高扩展的分布式全文 检索引擎,可以帮助我们从海量数据中快速找到需要的内容,它可以近乎实时的 存储、检索数据.还可以可以实现日志统计、分析、系统监控等功能. 官网 例如京东,淘宝,头条等站内搜索功能.
二、搭建Elasticsearch
1.安装ES
ES 下载地址: https://www.elastic.co/cn/downloads/elasticsearch 默认打开是最新版本
7.6.1 版下载 https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.1-windows-x86_64.zip
解压 在 bin 目录中 双击启动 elasticsearch.b
访问 http://127.0.0.1:9200
2.安装数据可视化界面 elasticsearch head
前提需要安装 nodejs github
下载: https://github.com/mobz/elasticsearch-head/
解压 从界面访问 9200 服务会出现跨域问题
在 config 目录中的 elasticsearch.yml 文件中配置
# 开启跨域
http.cors.enabled: true
# 所有人访问
http.cors.allow-origin: "*"
命令行进入目录
npm install
npm run star
访问:http://127.0.0.1:9100/
3.安装可视化 kibana 组件
Kibana 是一个针对 Elasticsearch 的开源分析及可视化平台,用来搜索、查看交互 存储在 Elasticsearch 索引中的数据。 使用 Kibana,可以通过各种图表进行高级数据分析及展示。Kibana 让海量数据更 容易理解
下载版本要和 ES 版本一致
下载地址: https://www.elastic.co/cn/downloads/kibana 默认打开是最新版本
7.6.1 下载版 https://artifacts.elastic.co/downloads/kibana/kibana-7.6.1-windows-x86_64.zip
汉化 kibana 修改 config 目录下的 kibana.yml 文件
i18n.locale: "zh-CN"
双击 bin 目录下的 kibana.bat
访问 http://127.0.0.1:5601
4.安装 ik 分词器插件
7.6.1 版下载 https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.6.1/elasticsearch- analysis-ik-7.6.1.zip
解压,在elasticsearch-7.6.1\plugins目录下创建名称为ik的文件夹,
将解压后的文件复 制到 ik 目录.
自定义 ik 分词器(非必要,可以根据实际情况选择配置)
在 elasticsearch-7.6.1\plugins\ik\config
添加 xxx.dic 文件 定义词组, .dic 文件必须是 utf-8 编码格式,否则启动报错
在 IKAnalyzer.cfg.xml 文件添加自定义分词器文件
三、ES 基本概念
elasticsearch 是面向文档存储的,可以是数据库中的一条商品数据,一个 订单信息。文档数据会被序列化为 json 格式后存储在 elasticsearch 中
索引:同类型文档的集合
文档:一条数据就是一个文档,es 中是 Json 格式 字段:Json 文档中的字段
映射:索引中文档的约束,比如字段名称、类型
关系行数据库 MySQL 和 elasticsearch 对比
Mysql:擅长事务类型操作,可以确保数据的安全和一致性
Elasticsearch:擅长海量数据的搜索、分析、计算.
正向索引和倒排索引 Mysql 采用正向索引:
基于文档 id 创建索引。查询词条时必须先找到文档,而后 判断是否包含搜索的内容. elasticsearch 采用倒排索引:
文档(document):每条数据就是一个文档
词条(term):文档按照语义分成的词语
四、ES 索引库基本操作
1.ES 索引库基本操作
mapping 属性
mapping 是对索引库中文档的约束,常见的 mapping 属性包括:
type:字段数据类型,常见的简单类型有:
字符串:text(可分词的文本),keyword(精确值,例如:品牌,国家,邮箱)
数值:long、integer、short、byte、double、float、
布尔:boolean
日期:date
对象:object
index:是否创建索引参与搜索,默认为 true,如果不需要参与搜索设置为 false
analyzer:使用哪种分词器
创建索引库和 mapping 的语法如下:
2.查询索引库
语法: GET /索引库名
实例: GET /news
3.删除索引库
语法: DELETE /索引库名
实例: DELETE /news
4.修改索引库
索引库和 mapping 一旦创建无法修改,但是可以添加新的字段,语法如下:
五、ES 文档操作
1.新增文档
语法:
POST /索引库名/_doc/文档 id {
“字段名 1”:”值 1”
“字段名 2”:”值 2”
.....
}
2.查询文档
语法:
GET /索引库名/_doc/文档 id
3.删除文档
语法:
DELETE /索引库名/_doc/档 id
4.修改文档
POST /索引库名/_update/文档 id {
"doc":{
"要修改的字段":"新值"
}
}
5.搜索文档
GET /news/_search {
"query":{
"match":{
"title":"美国"
}
}
}
六、SpringBoot 集成 ES
1.指定版本
版本必须与安装的 ES 版本一致
<properties>
<java.version>1.8</java.version>
<elasticsearch.version>7.6.1</elasticsearch.version>
</properties>
2.添加依赖
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>
3、索引库操作
(1)创建索引库
CreateIndexRequest request = new CreateIndexRequest("users");
CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
(2)判断索引库是否存在
GetIndexRequest request = new GetIndexRequest("users");
boolean exists = restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT);
(3)删除索引库
DeleteIndexRequest indexRequest = new DeleteIndexRequest("users");
AcknowledgedResponse delete = restHighLevelClient.indices().delete(indexRequest, RequestOptions.DEFAULT);
delete.isAcknowledged();//返回 true 删除成功,返回 false 删除失败
4.文档操作
(1)添加文档
//将新闻添加到 mysql 的同时,将数据同步更新到 ES,为搜索提供数据
News news = new News();
news.setId(3);
news.setTitle("美国今年要总统选择,拜登着急了");
news.setImg("aaaaasssss.jpg");
IndexRequest indexRequest = new IndexRequest("news").id(news.getId().toString());
//将对象转为 json 存进 ES
indexRequest.source(new ObjectMapper().writeValueAsString(news),XContentType.JSON);
restHighLevelClient.index(indexRequest,RequestOptions.DEFAULT);
(2)修改文档
News news = new News();
news.setId(3);
news.setTitle("中国航母开往美国,准备开战,拜登着急了");
news.setImg("dddddddddddd.jpg");
UpdateRequest updateRequest = new UpdateRequest("news",news.getId().toString());
updateRequest.doc(new ObjectMapper().writeValueAsString(news), XContentType.JSON);
restHighLevelClient.update(updateRequest,RequestOptions.DEFAULT);
(3)查询文档
GetRequest getRequest = new GetRequest("news","1");
GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
//获取查询的内容,返回 json 格式
String json = getResponse.getSourceAsString();
//使用 jackson 组件将 json 字符串解析为对象
News news = new ObjectMapper().readValue(json, News.class);
(4)删除文档
DeleteRequest deleteRequest = new DeleteRequest("news","1");
DeleteResponse delete = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
(5)搜索文档
SearchRequest searchRequest = new SearchRequest("news");
SearchRequest searchRequest = new SearchRequest("news");
//精确条件查询
searchRequest.source().query(QueryBuilders.termQuery("title","美国"));
//发送查询请求
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
//接收查询结果
SearchHits hits = search.getHits();
//组装查询结果
ArrayList<News> list = new ArrayList<>();
//取出结果集
for (SearchHit searchHit : hits.getHits()){
String json = searchHit.getSourceAsString();
News news = new ObjectMapper().readValue(json,News.class);
list.add(news);
}