发表时间:2022-03-21来源:网络
这是个人elasticsearch入门学习笔记。
内容:
1.elasticsearch的基础认识
2.了解es的基础增删改查
3.倒排索引,分词器简单了解
4.创建映射,添加数据,删除数据,更新数据,ID查询,关键词查询,分词查询,IK分词器,集群结构
5.java操作es,项目配置,jar包导入,定义索引库,java操作es的简单案例
springboot构架es的结构
Es和mysql字段对应
关系数据库 ⇒ 数据库 ⇒ 表 ⇒ 行 ⇒ 列(Columns)
Elasticsearch ⇒ 索引(Index) ⇒ 类型(type) ⇒ 文档(Docments) ⇒ 字段(Fields)
条件参数查询:
Shoid==or 满足任意条件都可以Must == and 必须多条件统一满足倒排索引
Es官方组件
需要的关键字:
id:Es的ID和mysql的ID要同步
Time:靠时间获取全量和曾量数据同步
对应的代码
创建映射:
添加文档(数据)
删除:文档
更新:文档,相当于在原来基础上覆盖
查询:
根据ID查询
根据关键词查询:查询关键字段
分词查询文档::在哪个域上执行查询,会进行分词
分词器
Ik分词器:ik_smart=最小单词为单位,ik_max_word=最大单词为单位,
集群:
一个索引库默认五片,组合在一起才是一个完整的索引库,每一片都一个复制节点
一个索引库的物理结构,主索引片和备份片不在一台服务器上,
集群:在一台设备上,建立多个es,把es名字统一,端口名细微改变如,9301,9302,9303等等,这样三台es启动,就自动建立起来了3个集群
java编写es 项目
导入依赖 定义mapping索引库
* must 相当于sql中and
* should 相当于sql中的or
* mustNot 不查xxx
* */
/**Bool bqb = .boolQuery();
bqb.mustNot(.termQuery("houseId", 1));
// 注意.termsQuery和.termQuery两个方法的不同
List itemIds = Lists.newArrayList(1L,2L,3L);
bqb.must(.termsQuery("itemId", itemIds)); // 相当于sql中 item_id in(1,2,3)
bqb.must(.termQuery("skuId","skuId003"));
AggregationBuilders
聚合查询,就是多条件比如分组,归类,统计,最大,最小,平均值
例如要计算每个球队的球员数,如果使用SQL语句,应表达如下:
select team, count(*) as player_count from player group by team;
ES的java api:
1
2
3
TermsBuilder teamAgg= AggregationBuilders.terms("player_count ").field("team");
sbuilder.addAggregation(teamAgg);
SearchResponse response = sbuilder.execute().actionGet();
例如要计算每个球队每个位置的球员数,如果使用SQL语句,应表达如下:
select team, position, count(*) as pos_count from player group by team, position;
ES的java api:
1
2
3
4
TermsBuilder teamAgg= AggregationBuilders.terms("player_count ").field("team");
TermsBuilder posAgg= AggregationBuilders.terms("pos_count").field("position");
sbuilder.addAggregation(teamAgg.subAggregation(posAgg));
SearchResponse response = sbuilder.execute().actionGet();
例如要计算每个球队年龄最大/最小/总/平均的球员年龄,如果使用SQL语句,应表达如下:
select team, max(age) as max_age from player group by team;
ES的java api:
1
2
3
4
TermsBuilder teamAgg= AggregationBuilders.terms("player_count ").field("team");
MaxBuilder ageAgg= AggregationBuilders.max("max_age").field("age");
Sbuilder .addAggregation(teamAgg.subAggregation(ageAgg));//根据团队下的年龄归类
SearchResponse response = sbuilder.execute().actionGet();
例如要计算每个球队球员的平均年龄,同时又要计算总年薪,如果使用SQL语句,应表达如下:
select team, avg(age)as avg_age, sum(salary) as total_salary from player group by team;
ES的java api:
1
2
3
4
5
6
TermsBuilder teamAgg= AggregationBuilders.terms("team");
AvgBuilder ageAgg= AggregationBuilders.avg("avg_age").field("age");
SumBuilder salaryAgg= AggregationBuilders.avg("total_salary ").field("salary");
sbuilder.addAggregation(teamAgg.subAggregation(ageAgg).subAggregation(salaryAgg));
SearchResponse response = sbuilder.execute().actionGet();
例如要计算每个球队总年薪,并按照总年薪倒序排列,如果使用SQL语句,应表达如下:
select team, sum(salary) as total_salary from player group by team order by total_salary desc;
ES的java api:
1
2
3
4
TermsBuilder teamAgg= AggregationBuilders.terms("team").order(Order.aggregation("total_salary ", false);
SumBuilder salaryAgg= AggregationBuilders.avg("total_salary ").field("salary");
sbuilder.addAggregation(teamAgg.subAggregation(salaryAgg));
SearchResponse response = sbuilder.execute().actionGet();
默认情况下,search执行后,仅返回10条聚合结果,如果想反悔更多的结果,需要在构建TermsBuilder 时指定size:
TermsBuilder teamAgg= AggregationBuilders.terms("team").size(15);
Aggregation结果的解析/输出
得到response后:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Map aggMap = response.getAggregations().asMap();
StringTerms teamAgg= (StringTerms) aggMap.get("keywordAgg");
Iterator teamBucketIt = teamAgg.getBuckets().iterator();
while (teamBucketIt .hasNext()) {
Bucket buck = teamBucketIt .next();
//球队名
String team = buck.getKey();
//记录数
long count = buck.getDocCount();
//得到所有子聚合
Map subaggmap = buck.getAggregations().asMap();
//avg值获取方法
double avg_age= ((InternalAvg) subaggmap.get("avg_age")).getValue();
//sum值获取方法
double total_salary = ((InternalSum) subaggmap.get("total_salary")).getValue();
//...
//max/min以此类推
}
2022-03-26
2022-03-26
2022-02-14
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26