ElasticSearch
目录结构
bin :启动文件
config:配置文件
log4j2 :日志配置文件
jvm.options java 虚拟机相关配置
elasticSerch.yml elasticSerch的配置文件 默认端口9200
lib:相关jar包
logs: 日志
modules:功能模块
pulgins:插件(ik)
1.安装es ,进入bin目录 双击运行elasticsearch.bat
浏览器地址输入:http://localhost:9200
2.安装图形化工具 head (前提必须安装node.js环境)
安装npm install
进入head目录,cmd 执行启动命令:npm run start
浏览器地址输入:http://localhost:9100
3.连接head 时存在跨域问题,需要爱es配置文件中(config/elasticSerch.yml )配置跨域属性值
http.cors.enabled: true
http.cors.allow-origin: "*"
4.了解ELK
ELK是Elasticsearch、Logstash、Kibana三大开源框架首字母大写简称。市面上也被成为Elastic Stack。其中Elasticsearch是一个基于Lucene、分布式、通过Restful方式进行交互的近实时搜索平台框 架。像类似百度、谷歌这种大数据全文搜索引擎的场景都可以使用Elasticsearch作为底层支持框架,可 见Elasticsearch提供的搜索能力确实强大,市面上很多时候我们简称Elasticsearch为es。Logstash是ELK 的中央数据流引擎,用于从不同目标(文件/数据存储/MQ)收集的不同格式数据,经过过滤后支持输出 到不同目的地(文 件/MQ/redis/elasticsearch/kafka等)。Kibana可以将elasticsearch的数据通过友好 的页面展示出来,提供实时分析的功能。
市面上很多开发只要提到ELK能够一致说出它是一个日志分析架构技术栈总称,但实际上ELK不仅仅适用 于日志分析,它还可以支持其它任何数据分析和收集的场景,日志分析和收集只是更具有代表性。并非 唯一性。
5.安装Kibana
Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索 引中的数据。使用Kibana,可以通过各种图表进行高级数据分析及展示。Kibana让海量数据更容易理 解。它操作简单,基于浏览器的用户界面可以快速创建仪表板(dashboard)实时显示Elasticsearch查 询动态。设置Kibana非常简单。无需编码或者额外的基础架构,几分钟内就可以完成Kibana安装并启动 Elasticsearch索引监测。 官网:https://www.elastic.co/cn/kibana
Kibana 版本要和 Es 一致!
进步bin目录执行kibana.bat运行
访问地址:http://localhost:5601
设置成中文的,在kibana 安装的目录下的config文件中的kibana.yml文件中设置
#i18n.locale: " ch-ZN"
ES
集群,节点,索引,类型,文档,映射
字段类型(mapping)中对于字段的定义称为映射, 比如 name 映射为字符串类型。
安装ik分词器
有两种分词
1.ik_smart :为最小切分
2.ik_max_word :为最细粒度切分
基于restFul风格命令
创建索引
PUT /test1/type1/1 { "name": "苦瓜先森", "age": 22 }
第一种情况
1.创建索引字段规则 注意没有写属性,默认属性是_doc(PUT /test2/_doc)
PUT /test2 { "mappings": { "properties": { "name": { "type": "text" }, "age": { "type": "long" }, "birthday": { "type": "date" } } } }
新建对应规则的文档**类型名称必须为_doc,字段类型必须对应
put /test2/_doc/1 { "name": "中国人名", "age": 12, "birthday": "2020-12-21" }
第二种情况
创建指定type类型规则 ElasticSearch7.x版本废弃这种写法了,ElasticSearch6.x支持
PUT /test3 { "mappings": { "test": { "properties": { "name": { "type": "text" }, "age": { "type": "long" }, "birthday": { "type": "date" } } } } }
修改
第一种方式
PUT /test2/_doc/1 { "name": "苦瓜先森11", "age": 22, "birthday": "2020-08-06" }
第二种方式
POSt /test2/_doc/1/_update { "doc": { "age": 99 } }
在原有的类型中添加新的字段 put /索引/_mapping/类型
PUT mprm/_mapping/mprm { "properties": { "customerNo": { "type": "text", "fields": { "raw": { "type": "keyword" } }, "fielddata": true } } }
查询
package com.tjetc.myspringboot; import com.alibaba.fastjson.JSON; import com.tjetc.myspringboot.bean.User; import org.elasticsearch.action.bulk.BulkRequest; import org.elasticsearch.action.bulk.BulkResponse; import org.elasticsearch.action.delete.DeleteRequest; import org.elasticsearch.action.delete.DeleteResponse; import org.elasticsearch.action.get.GetRequest; import org.elasticsearch.action.get.GetResponse; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.update.UpdateRequest; import org.elasticsearch.action.update.UpdateResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.client.indices.CreateIndexRequest; import org.elasticsearch.client.indices.CreateIndexResponse; import org.elasticsearch.client.indices.GetIndexRequest; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.TermQueryBuilder; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.fetch.subphase.FetchSourceContext; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.test.context.SpringBootTest; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.TimeUnit; @SpringBootTest class SpringbootSecurityApplicationTests { //方式一 @Autowired @Qualifier("restHighLevelClient") private RestHighLevelClient client; @Test void creatIndexRequest() throws IOException { //创建索引请求 CreateIndexRequest request = new CreateIndexRequest("fanlj_index"); //客户端执行请求 CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT); //返回创建的索引名称 String index = createIndexResponse.index(); System.out.println(index); } /** *索引是否存在 */ @Test void exitisIndexRequest() throws IOException { System.out.println(123); //创建索引请求 GetIndexRequest getRequest = new GetIndexRequest("fanlj_index"); //客户端执行请求 boolean exists = client.indices().exists(getRequest, RequestOptions.DEFAULT); System.out.println(exists); } /** * 添加一条文档 * @throws IOException */ @Test void createIndex() throws IOException { Date date = new Date(1998,8,6); //创建索引请求 User user = new User("苦瓜先生", 18, "男", date,"玩","IT"); // 创建请求 IndexRequest request = new IndexRequest("fanlj_index"); // 设置请求文档id request.id("2"); // 请求超时时间1秒 request.timeout("1s"); // 将我们的数据放入请求中 json格式 request.source(JSON.toJSONString(user),XContentType.JSON ); // 客户端发送请求,返回响应结果 IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT); System.out.println(indexResponse.toString()); // 返回请求状态 System.out.println(indexResponse.status()); } /** *获取文档 */ @Test void getIndexRequset() throws IOException { // 获取索引请求 GetIndexRequest getIndexRequest = new GetIndexRequest("fanlj_index"); // 索引请求是否存在 boolean exists = client.indices().exists(getIndexRequest, RequestOptions.DEFAULT); if(exists){ // 获取文档 GetRequest request = new GetRequest("fanlj_index", "1"); // 客户端发送请求 boolean exists1 = client.exists(request, RequestOptions.DEFAULT); System.out.println(exists1); } } /** *获取文档信息 */ @Test void getIndexRequsetDoc() throws IOException { // 获取索引请求 GetIndexRequest getIndexRequest = new GetIndexRequest("fanlj_index"); // 索引请求是否存在 boolean exists = client.indices().exists(getIndexRequest, RequestOptions.DEFAULT); if(exists){ // 获取文档 GetRequest request = new GetRequest("fanlj_index", "1"); boolean requestExists = client.exists(request, RequestOptions.DEFAULT); if (requestExists) { // 客户端发起获取请求 返回响应 GetResponse getResponse = client.get(request, RequestOptions.DEFAULT); //返回的结果 System.out.println(getResponse.getSourceAsString()); System.out.println(getResponse); } } } /** *更新文档信息 */ @Test void updateIndexRequsetDoc() throws IOException, ParseException { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); Date date = simpleDateFormat.parse("1998-08-06"); // 修改文档 UpdateRequest updateRequest = new UpdateRequest("fanlj_index", "1"); updateRequest.timeout("1s"); User user = new User("苦瓜先生", 18, "男", date,"乐","java"); updateRequest.doc(JSON.toJSONString(user), XContentType.JSON); UpdateResponse update = client.update(updateRequest, RequestOptions.DEFAULT); System.out.println(update.status()); } /** *更新文档信息 */ @Test void deleteIndexRequsetDoc() throws IOException, ParseException { // 删除文档 DeleteRequest deleteRequest = new DeleteRequest("fanlj_index", "1"); DeleteResponse delete = client.delete(deleteRequest, RequestOptions.DEFAULT); System.out.println(delete.status()); } /** *批量插入文档 */ @Test void batchIndexRequsetDoc() throws IOException, ParseException { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); Date date = simpleDateFormat.parse("1998-08-06"); BulkRequest bulkRequest = new BulkRequest(); bulkRequest.timeout("10s"); List<User> userList = new ArrayList<>(); userList.add(new User("sb", 18, "男", date,"乐","java")); userList.add(new User("sb", 18, "男", date,"乐","java")); userList.add(new User("sb", 18, "男", date,"乐","java")); userList.add(new User("sb", 18, "男", date,"乐","java")); userList.add(new User("sb", 18, "男", date,"乐","java")); for (int i = 0; i < userList.size(); i++) { bulkRequest.add(new IndexRequest("fanlj_index") .id("" + (i + 1)) .source(JSON.toJSONString(userList.get(i)), XContentType.JSON)); } BulkResponse bulk = client.bulk(bulkRequest, RequestOptions.DEFAULT); System.out.println(bulk.buildFailureMessage()); System.out.println(bulk.status()); System.out.println(bulk.hasFailures()); } /** *搜索 */ @Test void searchIndexRequsetDoc() throws IOException, ParseException { // 搜索请求 SearchRequest searchRequest = new SearchRequest("fanlj_index"); // 构建搜索器 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); // 查询条件 TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "sb"); sourceBuilder.query(termQueryBuilder); sourceBuilder.timeout(new TimeValue(60,TimeUnit.SECONDS)); searchRequest.source(sourceBuilder); SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT); System.err.println(JSON.toJSONString(search.getHits())); for (SearchHit documentFields : search.getHits().getHits()) { System.err.println(documentFields.getSourceAsMap()); } } }
复合查询