这是个人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查询
根据关键词查询:查询关键字段
分词查询文档:queryString:在哪个域上执行查询,会进行分词
分词器
Ik分词器:ik_smart=最小单词为单位,ik_max_word=最大单词为单位,
集群:
一个索引库默认五片,组合在一起才是一个完整的索引库,每一片都一个复制节点
一个索引库的物理结构,主索引片和备份片不在一台服务器上,
集群:在一台设备上,建立多个es,把es名字统一,端口名细微改变如,9301,9302,9303等等,这样三台es启动,就自动建立起来了3个集群
java编写es 项目
- 导入依赖
- 定义mapping索引库
Java语法
* must 相当于sql中and
* should 相当于sql中的or
* mustNot 不查xxx
* */
/**BoolQueryBuilder bqb = QueryBuilders.boolQuery();
bqb.mustNot(QueryBuilders.termQuery("houseId", 1));
// 注意QueryBuilders.termsQuery和QueryBuilders.termQuery两个方法的不同
List<Long> itemIds = Lists.newArrayList(1L,2L,3L);
bqb.must(QueryBuilders.termsQuery("itemId", itemIds)); // 相当于sql中 item_id in(1,2,3)
bqb.must(QueryBuilders.termQuery("skuId","skuId003"));
AggregationBuilders
聚合查询,就是多条件比如分组,归类,统计,最大,最小,平均值
例如要计算每个球队的球员数,如果使用SQL语句,应表达如下:
select team, count(*) as player_count from player group by team;
ES的java api:
|
例如要计算每个球队每个位置的球员数,如果使用SQL语句,应表达如下:
select team, position, count(*) as pos_count from player group by team, position;
ES的java api:
|
例如要计算每个球队年龄最大/最小/总/平均的球员年龄,如果使用SQL语句,应表达如下:
select team, max(age) as max_age from player group by team;
ES的java api:
|
例如要计算每个球队球员的平均年龄,同时又要计算总年薪,如果使用SQL语句,应表达如下:
select team, avg(age)as avg_age, sum(salary) as total_salary from player group by team;
ES的java api:
|
例如要计算每个球队总年薪,并按照总年薪倒序排列,如果使用SQL语句,应表达如下:
select team, sum(salary) as total_salary from player group by team order by total_salary desc;
ES的java api:
|
默认情况下,search执行后,仅返回10条聚合结果,如果想反悔更多的结果,需要在构建TermsBuilder 时指定size:
TermsBuilder teamAgg= AggregationBuilders.terms("team").size(15);
- Aggregation结果的解析/输出
得到response后:
Map<String, Aggregation> aggMap = response.getAggregations().asMap();
StringTerms teamAgg= (StringTerms) aggMap.get("keywordAgg");
Iterator<Bucket> 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以此类推
}
|