欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > Elasticsearch

Elasticsearch

2024/10/25 1:26:54 来源:https://blog.csdn.net/2301_78085386/article/details/141688506  浏览:    关键词:Elasticsearch

Elasticsearch

ES 概述

Elasticsearch,简称为 ES,是一款非常强大的开源的高扩展的分布式全文 检索引擎,可以帮助我们从海量数据中快速找到需要的内容,它可以近乎实时的 存储、检索数据.还可以可以实现日志统计、分析、系统监控等功能. 官网:https://www.elastic.co/cn 例如京东,淘宝,头条等站内搜索功能

mysql搜索匹配机制性能低,数量大的情况下影响性能 采用正向索引 从第一条开始匹配查询效率低 不能分词

可以将一些搜索数据例如新闻标题,商品名称等信息存入到ES中,然后用户搜索时,不从mysql查询,从ES中进行搜索,在通过信息id,直接到mysql中进行数据查询完整的信息

ES 环境搭建

安装 ES

ES 下载地址: https://www.elastic.co/cn/downloads/elasticsearch 默认打开是最新版本

解压 在 bin 目录中 双击启动 elasticsearch.b

访问 http://127.0.0.1:920

安装数据可视化界面 elasticsearch head

就是一个前端项目,可以可视化查看ES中的数据

前提需要安装 nodejs github

下载: https://github.com/mobz/elasticsearch-head/

github 加速器: https://github.ur1.fun/

解压

从界面访问 9200 服务会出现跨域问题 在 config 目录中的 elasticsearch.yml 文件中配置 # 开启跨域 http.cors.enabled: true # 所有人访问 http.cors.allow-origin: “*” 命令行进入目录

npm install npm run start

访问:http://127.0.0.1:9100/

安装可视化 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 启动

安装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中基本概念

索引:同一类型的文档集合 类似mysql中的表

文档:一条数据就是一个文档 类似mysql中的一行数据

字段:属性 类似mysql中的列名

映射:定义索引时给定的约束.

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

ES:擅长海量数据的搜索,分析,计算

ES索引库基本操作

创建索引库

创建索引库 mapping 属性 mapping 是对索引库中文档的约束,常见的 mapping 属性包括: type:字段数据类型,常见的简单类型有: 字符串:text(可分词的文本),keyword(精确值,例如:品牌,国家,邮箱) 数值:long、integer、short、byte、double、float、 布尔:boolean 日期:date 对象:object

index:是否创建索引参与搜索,默认为 true,如果不需要参与搜索设置为 false analyzer:使用哪种分词器

PUT /news
{"mappings": {"properties": {"id":{"type": "integer","index": false},"title":{"type": "text","analyzer": "ik_max_word"},"img":{"type": "keyword","index": false}}}
}

查询索引库

GET /news
语法: GET /索引库名
实例: GET /new

删除索引库

DELETE /news
语法: DELETE /索引库名
实例: DELETE /news

修改索引库

PUT /news/_mapping
{"properties":{"count":{"type":"long","index":false}}
}

ES 文档操作

新增文档

语法:
POST /索引库名/_doc/文档 id
{ 
“字段名 1”:”值 1”
“字段名 2”:”值 2”
..... 
}

查询文档

语法:
GET /索引库名/_doc/文档 id

删除文档

语法:
DELETE /索引库名/_doc/文档 id

修改文档

POST /索引库名/_update/文档 id
{ 
"doc":{ 
"要修改的字段":"新值"}
}

搜索文档

GET /news/_search
{ 
"query":{ "match":{ "title":"美国"}}
}

SpringBoot 集成 ES

指定版本,版本必须与安装的 ES 版本

<!--指定 jdk 和ES 版本-->
<properties><java.version>1.8</java.version><elasticsearch.version>7.6.1</elasticsearch.version>
</properties>

添加依赖

<!--ES client依赖-->
<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>

添加初始化 RestHighLevelClient 的配置类

@Configuration
public class ElasticSearchConfig {@Beanpublic RestHighLevelClient restHighLevelClient(){RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));return client;}}

索引库操作

创建索引库

CreateIndexRequest request = new CreateIndexRequest("users");
CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT)

判断索引库是否存在

GetIndexRequest request = new GetIndexRequest("users");
boolean exists = restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT);

删除索引库

DeleteIndexRequest indexRequest = new DeleteIndexRequest("users");
AcknowledgedResponse delete = restHighLevelClient.indices().delete(indexRequest, RequestOptions.DEFAULT);
delete.isAcknowledged();//返回 true 删除成功,返回 false 删除失败

文档操作

添加文档

//将新闻添加到 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);

修改文档

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);

查询文档

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);

删除文档

DeleteRequest deleteRequest = new DeleteRequest("news","1");
DeleteResponse delete = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);

搜索文档

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);

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com