网站建设属于技术服务吗,哪些网站可以做免费广告推广,医疗机构网站备案,wordpress出现500错误目录
一、概念介绍
二、Elasticsearch的Docker容器安装
2.1拉取elasticsearch的镜像文件
2.2运行docker命令启动容器
2.3通过访问端口地址查看部署情况
三、安装Kibana容器
3.1拉取Kibana镜像容器指令#xff08;默认拉取最新版本#xff09;#xff1a;
3.2拉取完…目录
一、概念介绍
二、Elasticsearch的Docker容器安装
2.1拉取elasticsearch的镜像文件
2.2运行docker命令启动容器
2.3通过访问端口地址查看部署情况
三、安装Kibana容器
3.1拉取Kibana镜像容器指令默认拉取最新版本
3.2拉取完成后运行docker命令部署Kibana 3.3访问kibana提供的界面检查是否部署成功
四、配置中文分词器IK分词器
4.1在线安装IK插件
4.2离线安装
4.3通过IK分词器实现拓展词库以及屏蔽不需要的创建词条的词语
五、elasticsearch的DSL指令使用
5.1创建索引库和mapping的DSL语句如下
5.2其他常见索引库操作指令
5.3使用DSL语句对文档数据进行操作
5.3.1新增文档
5.3.2查看删除文档
5.3.3修改文档
六、使用JavaRestClient实现创建、删除索引库判断索引库是否存在
6.1、引入es的RestHighLevelClient依赖
6.2配置config文件初始化RestHighLevelClient
6.3创建索引库
6.4删除索引库
6.5获取索引库 七、使用RestClient操作文档数据
7.1向索引库中添加文档数据
7.2获取文档对象并解析转换为实体对象
7.3更新文档对象数据
7.4删除文档对象 7.5实现批量插入文档对象 一、概念介绍 概念 什么是ES? 从功能上来说elasticsearchelasticsearchelasticsearch是一款非常强大的开源搜索引擎可以帮助我们从海量数据中快速找到需要的内容实现搜索、日志统计、分析、系统监控等功能从架构上说elasticsearch是elastic stack的核心负责存储、搜索、分析数据。 什么是elastic stack elasticsearch结合kibana、Logstash、Beats也就是elastic stackELK。被广泛应用在日志数据分析、实时监控等领域 ES能够实现对数据的快速搜索主要原因就是它采用倒排索引的方式 倒排索引中包含两部分内容 词条词典Term Dictionary记录所有词条以及词条与倒排列表Posting List之间的关系会给词条创建索引提高查询和插入效率倒排列表Posting List记录词条所在的文档id、词条出现频率 、词条在文档中的位置等信息文档id用于快速获取文档词条频率TF文档在词条出现的次数用于评分 简单来说就是将一条条数据划分一个个文档再对整个文档中的某些字段建立倒排索引将字段按照语义划分成词语再将每个不同的词语作为主键对应的值就是文档的id如下图 ES搜索流程 同时ES也是面向文档进行存储可以是数据库中的一条商品数据一个订单信息。 文档数据会被序列化为json格式后存储在elasticsearch中 索引相同类型的文档的集合 映射mapping索引中文档的字段约束信息类似表的结构约束 下面为了加深读者对ES的认识有关于elasticsearch和数据库的对比表格 MySQL Elasticsearch 说明 Table Index 索引(index)就是文档的集合类似数据库的表(table) Row Document 文档Document就是一条条的数据类似数据库中的行Row文档都是JSON格式 Column Field 字段Field就是JSON文档中的字段类似数据库中的列Column Schema Mapping Mapping映射是索引中文档的约束例如字段类型约束。类似数据库的表结构Schema SQL DSL DSL是elasticsearch提供的JSON风格的请求语句用来操作elasticsearch实现CRUD 架构对比 Mysql擅长事务类型操作可以确保数据的安全和一致性 Elasticsearch擅长海量数据的搜索、分析、计算 二、Elasticsearch的Docker容器安装
2.1拉取elasticsearch的镜像文件 默认拉取最新版本内容较大可能拉取失败可以提前在windows下载好上传到linux中
docker pull docker.elastic.co/elasticsearch/elasticsearch
导入上传的镜像的tar包
docker load -i es.tar
2.2运行docker命令启动容器
这里指定运行内存大小为512M读者可更更具需求自行变更,详细命令解释如下
docker run -d \--name es \-e ES_JAVA_OPTS-Xms512m -Xmx512m \-e discovery.typesingle-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
命令解释:
-e cluster.namees-docker-cluster设置集群名称-e http.host0.0.0.0监听的地址可以外网访问-e ES_JAVA_OPTS-Xms512m -Xmx512m内存大小-e discovery.typesingle-node非集群模式-v es-data:/usr/share/elasticsearch/data挂载逻辑卷绑定es的数据目录-v es-logs:/usr/share/elasticsearch/logs挂载逻辑卷绑定es的日志目录-v es-plugins:/usr/share/elasticsearch/plugins挂载逻辑卷绑定es的插件目录--privileged授予逻辑卷访问权--network es-net 加入一个名为es-net的网络中方便之后创建Kibana容器后两者互相连接-p 9200:9200端口映射配置
2.3通过访问端口地址查看部署情况 查询如上图所示则表示查询成功
三、安装Kibana容器
为了实现对elasticsearch可视化操作我们需要使用Kibana帮助我们搭建一个页面实现对es的操作
注意Kibana和ES版本必须一致
3.1拉取Kibana镜像容器指令默认拉取最新版本
docker pull docker.elastic.co/kibana/kibana
3.2拉取完成后运行docker命令部署Kibana
docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTShttp://es:9200 \
--networkes-net \
-p 5601:5601 \
kibana:7.12.1
指令解释 --network es-net 加入一个名为es-net的网络中与elasticsearch在同一个网络中 -e ELASTICSEARCH_HOSTShttp://es:9200设置elasticsearch的地址因为kibana已经与elasticsearch在一个网络因此可以用容器名直接访问elasticsearch -p 5601:5601端口映射配置 3.3访问kibana提供的界面检查是否部署成功 四、配置中文分词器IK分词器 官方提供的分词器对中文的支持很不友好所以我们需要引入第三方的IK分词器插件 ik分词器包含两种模式 ik_smart最少切分粗粒度ik_max_word最细切分细粒度 4.1在线安装IK插件
注意IK分词器插件的版本需要对应自己的ES版本比如我这里的7.12.1
官方插件下载地址
# 进入容器内部
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
4.2离线安装 如果提前在官方网址下载好了对应的IK分词器可通过上传到数据卷的方式完成安装
安装插件需要知道elasticsearch的plugins目录位置而我们用了数据卷挂载因此需要查看elasticsearch的数据卷目录通过下面命令查看:
docker volume inspect es-plugins
地址 将下载好的IK分词器的zip包解压成ik文件并上传到/var/lib/docker/volumes/es-plugins/_data文件内 重新启动容器完成插件安装
4.3通过IK分词器实现拓展词库以及屏蔽不需要的创建词条的词语
要拓展ik分词器的词库只需要修改一个ik分词器目录中的config目录中的IkAnalyzer.cfg.xml文件
?xml version1.0 encodingUTF-8?
!DOCTYPE properties SYSTEM http://java.sun.com/dtd/properties.dtd
propertiescommentIK Analyzer 扩展配置/comment!--用户可以在这里配置自己的扩展字典 --entry keyext_dictext.dic/entry!--用户可以在这里配置自己的扩展停止词字典--entry keyext_stopwordsstopword.dic/entry!--用户可以在这里配置远程扩展字典 --!-- entry keyremote_ext_dictwords_location/entry --!--用户可以在这里配置远程扩展停止词字典--!-- entry keyremote_ext_stopwordswords_location/entry --
/propertiesext.dic文本文件格式示例直接换行输入你想要添加的扩展词汇 stopword.dic文本文件格式如上
五、elasticsearch的DSL指令使用 在创建索引库中需要了解索引库的Mapping属性 mapping是对索引库中文档的约束常见的mapping属性包括 type字段数据类型常见的简单类型有字符串text可分词的文本、keyword精确值例如品牌、国家、ip地址数值long、integer、short、byte、double、float、布尔boolean日期date对象objectindex是否创建索引默认为trueanalyzer使用哪种分词器 properties该字段的子字段 总结 Mapping常见属性 type数据类型index是否索引analyzer分词器properties子字段 常见type类型 字符串text、keyword数字long、integer、short、byte、double、float布尔boolean日期date对象object 5.1创建索引库和mapping的DSL语句如下
ES中通过Restful请求操作索引库、文档所以第一行Kibana需要发送一段请求请求中携带DSL语句完成创建demo索引库
PUT /demo
{mappings: {properties: {info:{type: text,analyzer: ik_smart},email:{type: keyword,index: false},name:{properties: {firstName: {type: keyword}}},// ... 略}}
}5.2其他常见索引库操作指令
查看索引库语法
GET /替换为需要查询的索引库名称 删除索引库的语法
DELETE /替换为需要查询的索引库名称
修改索引库语法
注意 索引库和mapping一旦创建无法修改但是可以添加新的字段语法如下
PUT /索引库名/_mapping
{properties: {新字段名:{type: integer}}
}总结 索引库操作 创建索引库PUT /索引库名查询索引库GET /索引库名删除索引库DELETE /索引库名添加字段PUT /索引库名/_mapping 5.3使用DSL语句对文档数据进行操作
5.3.1新增文档
语法
POST /索引库名/_doc/文档id
{字段1: 值1,字段2: 值2,字段3: {子属性1: 值3,子属性2: 值4},// ...
}如 注意 插入文档时es会检查文档中的字段是否有mapping如果没有则按照默认mapping规则来创建索引。如果默认mapping规则不符合你的需求一定要自己设置字段mapping
5.3.2查看删除文档
查看文档语法
GET /索引库名/_doc/文档id
删除索引库的语法
DELETE /索引库名/_doc/文档id
5.3.3修改文档
方式一全量修改语法删除原文档数据再新增本文档数据
PUT /索引库名/_doc/文档id
{字段1: 值1,字段2: 值2,// ... 略
}方式二增量修改修改指定字段值语法
POST /索引库名/_update/文档id
{doc: {字段名: 新的值,}
}
六、使用JavaRestClient实现创建、删除索引库判断索引库是否存在
6.1、引入es的RestHighLevelClient依赖
propertiesjava.version1.8/java.versionelasticsearch.version7.12.1/elasticsearch.version
/properties
dependencygroupIdorg.elasticsearch.client/groupIdartifactIdelasticsearch-rest-high-level-client/artifactId
/dependency
6.2配置config文件初始化RestHighLevelClient
Configuration
public class ClientConfiguration {Beanpublic RestHighLevelClient client() {return new RestHighLevelClient(RestClient.builder(new HttpHost(192.168.150.128, 9200, http)));}}
6.3创建索引库 Testvoid createIndex() throws IOException {//1.创建Request对象CreateIndexRequest request new CreateIndexRequest(demo);//2.准备请求的参数DSL语句request.source(HOTEL_CONSTANT, XContentType.JSON);//3.发送请求client.indices().create(request, RequestOptions.DEFAULT);}
6.4删除索引库
Testvoid deleteIndex() throws IOException {DeleteIndexRequest request new DeleteIndexRequest(demo);client.indices().delete(request, RequestOptions.DEFAULT);}
6.5获取索引库 Testvoid getIndex() throws IOException {GetIndexRequest request new GetIndexRequest(demo);boolean exists client.indices().exists(request, RequestOptions.DEFAULT);log.info(exists ? exists : not exists);}七、使用RestClient操作文档数据
7.1向索引库中添加文档数据 Testvoid testAddDocument() throws IOException {//准备数据数据来源于数据库Hotel hotel hotelService.getById(36934L);//转换为文档类型HotelDoc hotelDoc new HotelDoc(hotel);//1.准备Request对象IndexRequest request new IndexRequest(hotel).id(hotelDoc.getId().toString());//2.准备JSON数据request.source(JSON.toJSONString(hotelDoc), XContentType.JSON);//3.发送请求client.index(request, RequestOptions.DEFAULT);}7.2获取文档对象并解析转换为实体对象 Testvoid testGetDocument() throws IOException {//准备Request对象GetRequest hotel new GetRequest(hotel, 36934);//发送请求得到结果GetResponse response client.get(hotel, RequestOptions.DEFAULT);//解析结果String source response.getSourceAsString();//反序列化的hotel对象HotelDoc hotelDoc JSON.parseObject(source, HotelDoc.class);log.info(hotelDoc.toString());}
7.3更新文档对象数据 Testvoid testUpdateDocument() throws IOException {//准备Request对象UpdateRequest request new UpdateRequest(hotel, 36934);//准备请求参数request.doc(price, 99);//发送请求client.update(request, RequestOptions.DEFAULT);}
7.4删除文档对象 Testvoid testDeleteDocument() throws IOException {DeleteRequest request new DeleteRequest(hotel, 36934);client.delete(request, RequestOptions.DEFAULT);} 7.5实现批量插入文档对象 Testvoid testBulk() throws IOException {//查询所有酒店数据ListHotel hotels hotelService.list();//创建request对象BulkRequest bulkRequest new BulkRequest();//将hotel对象转换为hotelDoc对象for (Hotel hotel : hotels) {HotelDoc hotelDoc new HotelDoc(hotel);bulkRequest.add(new IndexRequest(hotel).id(hotelDoc.getId().toString()).source(JSON.toJSONString(hotelDoc), XContentType.JSON));}//发送请求信息client.bulk(bulkRequest, RequestOptions.DEFAULT);}