文章目录
ES简介
ES安装和Kilbana可视化安装
docker–es挂载linux
#查看防火墙开启的端口号
firewall-cmd --state //查看运行状态
firewall-cmd --list-all
// 开放1024的端口
firewall-cmd --add-port=1024/tcp --permanent
// 重载生效刚才的端口设置
firewall-cmd --reload
#进入运行的服务容器的内部
docker exec -it mysql /bin/bash
开启9200和9300的防火墙端口+阿里云的安全组
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.4.2
继续检查权限问题
postman测试ES
docker–kibana配置
# kibana指定了了ES交互端口9200 # 5601位的kibana主页端口
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://118.31.113.58:9200 -p 5601:5601 -d kibana:7.4.2
重启docker+重启容器(name)
f2c1f16e7ba3 kibana:7.4.2 "/usr/local/bin/dumb…" 3 hours ago Exited (255) About a minute ago 0.0.0.0:5601->5601/tcp, :::5601->5601/tcp kibana
745ae8b1bd1e elasticsearch:7.4.2 "/usr/local/bin/dock…" 3 hours ago Exited (255) About a minute ago 0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 0.0.0.0:9300->9300/tcp, :::9300->9300/tcp elasticsearch
a370cd04c1f3 redis "docker-entrypoint.s…" 9 days ago Exited (255) About a minute ago 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp redis
0473697f79a4 mysql:5.7 "docker-entrypoint.s…" 9 days ago Exited (255) About a minute ago 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql
服务器重启后:docker启动+重启容器(docker restart 容器name)
ES入门
基础的增删改查(postman测试)
get查询和seq_no的乐观锁状态(用于高并发的问题CAS)
bulk 批量 API(kibana测试)
两条数据是独立的统计的
测试数据链接
ES进阶
search API
Query字段:
source字段:
match匹配查询:(会进行分词查询)
bool复合查询(嵌套查询)
should字段,影响查询的得分情况(能够看到相关度越高,得分也越高。)
filter结果过滤:(区间检索)
term字段的使用:
全文检索字段用match,其他非text字段匹配用term
Mapping映射
创建索引并指定映射:(这个type字段已经过时了)
PUT /my_index
{
"mappings": {
"properties": {
"age": {
"type": "integer"
},
"email": {
"type": "keyword" # 指定为keyword
},
"name": {
"type": "text" # 全文检索。保存时候分词,检索时候进行分词匹配
}
}
}
}
对已创建的索引添加新的字段映射(指定不能检索):
==修改映射 && 数据迁移 ==
希望修改原来的age字段从long修改为integer,只能先创建新的索引,再使用数据迁移
POST _reindex
{
"source": {
"index": "bank",
"type": "account"
},
"dest": {
"index": "newbank"
}
}
分词器
ES内置的标准分词器:
安装ik分词器
github地址
直接将ik分词器的压缩包放到es的plugins的目录下(我们做好了docker容器和linux的映射的文件关系)
unzip elasticsearch-analysis-ik-7.4.2.zip -d ik
rm -rf elasticsearch-analysis-ik-7.4.2.zip
别忘了重启es的容器:
测试ik分词器
自定义扩展词库
linux相关的docker安装nginx 1.10
默认访问html目录下的文件
nginx存放的新的分词存放入ik分词器的配置文件
重启es
检测测试自定义的分词效果就不检测了,linux带不动了
原理学习
倒排索引
es的数据类型区分:text和keyword
ES整合Springboot
Elasticsearch-Rest-Client:官方 RestClient,封装了 ES 操作,API 层次分明,上手简单(相当于是个和springboot准备好的API调用)
相关的准备工作
指定es的版本,防止导入低阶的Springboot的自带es的低阶版本
渐渐有感觉了,排除了相关数据源的注入(或者直接在common依赖排除相关的jar包)
RestHighLevelClient的配置工作(这个client用来创建索引,保存索引,进行复杂的检索等功能)
@Configuration
public class GulimallEsConfig {
@Value("${ipAddr}")
private String host;
public static final RequestOptions COMMON_OPTIONS;
static {
RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
COMMON_OPTIONS = builder.build();
}
/**
* final String hostname, final int port, final String scheme
*/
@Bean
public RestHighLevelClient esRestClient() {
RestClientBuilder builder = null;
// 可以指定多个es
builder = RestClient.builder(new HttpHost(host, 9200, "http"));
RestHighLevelClient client = new RestHighLevelClient(builder);
return client;
}
}
整合的测试工作
索引的创建和保存
@Test
public void indexData() throws IOException {
// 设置索引
IndexRequest indexRequest = new IndexRequest("user");
indexRequest.id("1");
User user = new User();
user.setUserName("张三");
user.setAge(20);
user.setGender("男");
String jsonString = JSON.toJSONString(user);//将封装的对象转换为json对象
//设置要保存的内容,指定数据和类型(source)
indexRequest.source(jsonString, XContentType.JSON);
//执行创建索引和保存数据(index)
IndexResponse index = client.index(indexRequest, GulimallEsConfig.COMMON_OPTIONS);
System.out.println(index);
}
复杂的检索功能
聚合函数的检索条件,或许生成的json字符串对象
@Test
public void find() throws IOException {
// 1 创建检索请求
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("bank");
// 构造检索条件:query,from ,size,aggregation等等
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchQuery("address","mill"));
//AggregationBuilders工具类构建AggregationBuilder
// 构建第一个聚合条件:按照年龄的值分布进行聚合
TermsAggregationBuilder agg1 = AggregationBuilders.terms("agg1").field("age").size(10);// 聚合名称
sourceBuilder.aggregation(agg1);
// 构建第二个聚合条件:平均薪资
AvgAggregationBuilder agg2 = AggregationBuilders.avg("agg2").field("balance");
sourceBuilder.aggregation(agg2);
System.out.println("检索条件"+sourceBuilder.toString());
searchRequest.source(sourceBuilder);//真正的检索复杂条件
// 2 执行--检索
SearchResponse response = client.search(searchRequest, GulimallEsConfig.COMMON_OPTIONS);
// 3 分析响应结果
System.out.println(response.toString());
}
检索的json字符串,重新封装为javabean对象
// 将获取到的相应结果重新进行封装
JSON.parseObject(response.toString(), Map.class);
// 3.1 获取java bean
SearchHits hits = response.getHits();
SearchHit[] hits1 = hits.getHits();
for (SearchHit hit : hits1) {
hit.getId();
hit.getIndex();
String sourceAsString = hit.getSourceAsString();//相当于是获取元数据
Account account = JSON.parseObject(sourceAsString, Account.class);
System.out.println(account);
}
获取检索到的聚合函数的分析信息(注意不同的聚合函数,返回的解析对象是不同的:Terms和avg)
// 3.2 获取检索到的分析信息
Aggregations aggregations = response.getAggregations();
Terms aggtest1 = aggregations.get("agg1");
for (Terms.Bucket bucket : aggtest1.getBuckets()) {
String keyAsString = bucket.getKeyAsString();
System.out.println(keyAsString);
}
Avg aggtest2 = aggregations.get("agg2");
System.out.println(aggtest2.getValue());