这是个人elasticsearch入门学习笔记。

内容:

1.elasticsearch的基础认识

2.了解es的基础增删改查

3.倒排索引,分词器简单了解

4.创建映射,添加数据,删除数据,更新数据,ID查询,关键词查询,分词查询,IK分词器,集群结构

5.java操作es,项目配置,jar包导入,定义索引库,java操作es的简单案例

 

 

springboot构架es的结构

java es查询并排序 java es 排序_es

 

 

Es和mysql字段对应

java es查询并排序 java es 排序_elasticsearch_02

关系数据库     ⇒ 数据库 ⇒ 表    ⇒ 行    ⇒ 列(Columns)

Elasticsearch  ⇒ 索引(Index)   ⇒ 类型(type)  ⇒ 文档(Docments)  ⇒ 字段(Fields)

 

 

条件参数查询

java es查询并排序 java es 排序_elasticsearch_03

  1. Shoid==or 满足任意条件都可以
  2. Must == and 必须多条件统一满足

倒排索引

java es查询并排序 java es 排序_java_04

java es查询并排序 java es 排序_java_05

 

 

Es官方组件

java es查询并排序 java es 排序_java_06

需要的关键字:

id:Es的ID和mysql的ID要同步

Time:靠时间获取全量和曾量数据同步

java es查询并排序 java es 排序_elasticsearch_07

java es查询并排序 java es 排序_java_08

java es查询并排序 java es 排序_java_09

对应的代码

java es查询并排序 java es 排序_java es查询并排序_10

创建映射:

java es查询并排序 java es 排序_java es查询并排序_11

添加文档(数据)

java es查询并排序 java es 排序_elasticsearch_12

删除:文档

java es查询并排序 java es 排序_java es查询并排序_13

更新:文档,相当于在原来基础上覆盖

java es查询并排序 java es 排序_java es查询并排序_14

 

 

查询:

根据ID查询

java es查询并排序 java es 排序_java es查询并排序_15

根据关键词查询:查询关键字段

java es查询并排序 java es 排序_elasticsearch_16

分词查询文档:queryString:在哪个域上执行查询,会进行分词

java es查询并排序 java es 排序_es_17

分词器

java es查询并排序 java es 排序_elasticsearch_18

Ik分词器:ik_smart=最小单词为单位,ik_max_word=最大单词为单位,

java es查询并排序 java es 排序_大数据_19

集群

一个索引库默认五片,组合在一起才是一个完整的索引库,每一片都一个复制节点

java es查询并排序 java es 排序_java es查询并排序_20

一个索引库的物理结构,主索引片和备份片不在一台服务器上,

 

java es查询并排序 java es 排序_java es查询并排序_21

 

 

 

集群:在一台设备上,建立多个es,把es名字统一,端口名细微改变如,9301,9302,9303等等,这样三台es启动,就自动建立起来了3个集群

java es查询并排序 java es 排序_大数据_22

 

 

java编写es 项目

  

java es查询并排序 java es 排序_java_23

java es查询并排序 java es 排序_elasticsearch_24

  1. 导入依赖
  2. 定义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

聚合查询,就是多条件比如分组,归类,统计,最大,最小,平均值

java es查询并排序 java es 排序_es_25

例如要计算每个球队的球员数,如果使用SQL语句,应表达如下:

select team, count(*) as player_count from player group by team;

ES的java api:

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:

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:

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:

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:

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后:

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以此类推
}
  1.  
  2. (1)统计某个字段的数量
  3. ValueCountBuilder vcb= AggregationBuilders.count("count_uid").field("uid");
  4. (2)去重统计某个字段的数量(有少量误差)
  5. CardinalityBuilder cb= AggregationBuilders.cardinality("distinct_count_uid").field("uid");
  6. (3)聚合过滤
  7. FilterAggregationBuilder fab= AggregationBuilders.filter("uid_filter").filter(QueryBuilders.queryStringQuery("uid:001"));
  8. (4)按某个字段分组
  9. TermsBuilder tb= AggregationBuilders.terms("group_name").field("name");
  10. (5)求和
  11. SumBuilder sumBuilder= AggregationBuilders.sum("sum_price").field("price");
  12. (6)求平均
  13. AvgBuilder ab= AggregationBuilders.avg("avg_price").field("price");
  14. (7)求最大值
  15. MaxBuilder mb= AggregationBuilders.max("max_price").field("price");
  16. (8)求最小
  17. MinBuilder min= AggregationBuilders.min("min_price").field("price");
  18. (9)按日期间隔分组
  19. DateHistogramBuilder dhb= AggregationBuilders.dateHistogram("dh").field("date");
  20. (10)获取聚合里面的结果
  21. TopHitsBuilder thb= AggregationBuilders.topHits("top_result");
  22. (11)嵌套的聚合
  23. NestedBuilder nb= AggregationBuilders.nested("negsted_path").path("quests");
  24. (12)反转嵌套
  25. AggregationBuilders.reverseNested("res_negsted").path("kps ");