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());
}
}
}
复合查询

浙公网安备 33010602011771号