目录

ElasticSearch 实现分词全文检索 - 概述

ElasticSearch 实现分词全文检索 - ES、Kibana、IK安装

ElasticSearch 实现分词全文检索 - Restful基本操作

ElasticSearch 实现分词全文检索 - Java SpringBoot ES 索引操作

ElasticSearch 实现分词全文检索 - Java SpringBoot ES 文档操作

ElasticSearch 实现分词全文检索 - 测试数据准备

ElasticSearch 实现分词全文检索 - term、terms查询

ElasticSearch 实现分词全文检索 - match、match_all、multimatch查询

ElasticSearch 实现分词全文检索 - id、ids、prefix、fuzzy、wildcard、range、regexp 查询

ElasticSearch 实现分词全文检索 - Scroll 深分页

ElasticSearch 实现分词全文检索 - delete-by-query

ElasticSearch 实现分词全文检索 - 复合查询

ElasticSearch 实现分词全文检索 - filter查询

ElasticSearch 实现分词全文检索 - 高亮查询

ElasticSearch 实现分词全文检索 - 聚合查询 cardinality

ElasticSearch 实现分词全文检索 - 经纬度查询

ElasticSearch 实现分词全文检索 - 搜素关键字自动补全(suggest) 以下待发布

ElasticSearch 实现分词全文检索 - SpringBoot 完整实现 Demo 附源码

数据准备

ElasticSearch 实现分词全文检索 - 测试数据准备

聚合查询

ES 的聚合查询和MySQL的聚合查询类型,ES的聚合查询相比MySQL要强大,提供的统计数据的方式多种多样

  1. # ES聚合查询的 Restful 语法
  2. POST /index/type/_search
  3. {
  4. "aggs":{
  5. "名字(agg)":{
  6. "agg_type":{
  7. "属性":"值"
  8. }
  9. }
  10. }
  11. }

去重计数查询 (Cardinality)

去重计数,即 Cardinality,第一步先将返回的文档中的一个指定的field进行去重,统计一共有多少条

  1. #去重计数
  2. POST /sms-logs-index/_search
  3. {
  4. "aggs": {
  5. "agg": {
  6. "cardinality": {
  7. "field": "province"
  8. }
  9. }
  10. }
  11. }

Java

  1. @Test
  2. void cardinalityQuery() throws Exception {
  3. String indexName = "sms-logs-index";
  4. RestHighLevelClient client = ESClient.getClient();
  5. //1. 创建SearchRequest对象
  6. SearchRequest request = new SearchRequest(indexName);
  7. //2. 指定查询条件
  8. SearchSourceBuilder builder = new SearchSourceBuilder();
  9. builder.aggregation(AggregationBuilders.cardinality("agg").field("province"));
  10. request.source(builder);
  11. //3. 执行查询
  12. SearchResponse resp = client.search(request, RequestOptions.DEFAULT);
  13. //4. 输出返回值
  14. Cardinality agg = resp.getAggregations().get("agg");
  15. long value = agg.getValue();
  16. System.out.println(value);
  17. }

范围统计 (range)

统计一定范围内出现的文档个数,比如:针对某一个Field的值在 0100,100200,200~300 之间文档出现的个数分别是多少

范围统计可以针对普通的数值,针对时间类型,针对IP类型,都可以做相应的统计。

range,data_range,ip_range

  1. # 数值方式范围统计
  2. POST /sms-logs-index/_search
  3. {
  4. "aggs": {
  5. "agg": {
  6. "range": {
  7. "field": "fee",
  8. "ranges": [
  9. {
  10. "to": 20
  11. },
  12. {
  13. "from": 20, # from 有包含当前值的意思
  14. "to": 30
  15. },
  16. {
  17. "from": 30
  18. }
  19. ]
  20. }
  21. }
  22. }
  23. }
  24. # 数值方式范围统计
  25. POST /sms-logs-index/_search
  26. {
  27. "aggs": {
  28. "agg": {
  29. "date_range": {
  30. "field": "createDate",
  31. "format":"yyyy",
  32. "ranges": [
  33. {
  34. "to": 2023 # 2023以前的数据量
  35. },
  36. {
  37. "from": 2023 # 2023以后的数据量
  38. }
  39. ]
  40. }
  41. }
  42. }
  43. }
  44. # IP方式范围统计
  45. POST /sms-logs-index/_search
  46. {
  47. "aggs": {
  48. "agg": {
  49. "ip_range": {
  50. "field": "ipAddr",
  51. "ranges": [
  52. {
  53. "to": "172.16.0.4"
  54. },
  55. {
  56. "from": "172.16.0.4"
  57. }
  58. ]
  59. }
  60. }
  61. }
  62. }

Java

  1. @Test
  2. void rangeQuery() throws Exception {
  3. String indexName = "sms-logs-index";
  4. RestHighLevelClient client = ESClient.getClient();
  5. //1. 创建SearchRequest对象
  6. SearchRequest request = new SearchRequest(indexName);
  7. //2. 指定查询条件
  8. SearchSourceBuilder builder = new SearchSourceBuilder();
  9. builder.aggregation(AggregationBuilders.range("agg").field("fee")
  10. .addUnboundedTo(20)
  11. .addRange(20, 30)
  12. .addUnboundedFrom(30));
  13. request.source(builder);
  14. //3. 执行查询
  15. SearchResponse resp = client.search(request, RequestOptions.DEFAULT);
  16. //4. 输出返回值
  17. org.elasticsearch.search.aggregations.bucket.range.Range agg = resp.getAggregations().get("agg");
  18. for (Range.Bucket bucket : agg.getBuckets()) {
  19. String key = bucket.getKeyAsString();
  20. Object from = bucket.getFrom();
  21. Object to = bucket.getTo();
  22. long docCount = bucket.getDocCount();
  23. System.out.println(String.format("Key:%s From: %s to: %s DocCount: %s", key, from, to, docCount));
  24. }
  25. }

统计聚合查询 (extended_stats)

他可以查询指定Field的最大值,最小值,平均值,平方和...

  1. # 统计聚合查询
  2. POST /sms-logs-index/_search
  3. {
  4. "aggs": {
  5. "agg": {
  6. "extended_stats": {
  7. "field": "fee"
  8. }
  9. }
  10. }
  11. }

返回值

  1. "aggregations" : {
  2. "agg" : {
  3. "count" : 8,
  4. "min" : 17.0,
  5. "max" : 45.0,
  6. "avg" : 31.25,
  7. "sum" : 250.0,
  8. "sum_of_squares" : 8468.0,
  9. "variance" : 81.9375,
  10. "variance_population" : 81.9375,
  11. "variance_sampling" : 93.64285714285714,
  12. "std_deviation" : 9.051933495115836,
  13. "std_deviation_population" : 9.051933495115836,
  14. "std_deviation_sampling" : 9.676923950453322,
  15. "std_deviation_bounds" : {
  16. "upper" : 49.35386699023167,
  17. "lower" : 13.146133009768327,
  18. "upper_population" : 49.35386699023167,
  19. "lower_population" : 13.146133009768327,
  20. "upper_sampling" : 50.60384790090664,
  21. "lower_sampling" : 11.896152099093356
  22. }
  23. }
  24. }

Java

  1. @Test
  2. void extendedQuery() throws Exception {
  3. String indexName = "sms-logs-index";
  4. RestHighLevelClient client = ESClient.getClient();
  5. //1. 创建SearchRequest对象
  6. SearchRequest request = new SearchRequest(indexName);
  7. //2. 指定查询条件
  8. SearchSourceBuilder builder = new SearchSourceBuilder();
  9. builder.aggregation(AggregationBuilders.range("agg").field("fee"));
  10. request.source(builder);
  11. //3. 执行查询
  12. SearchResponse resp = client.search(request, RequestOptions.DEFAULT);
  13. //4. 输出返回值
  14. ExtendedStats agg = resp.getAggregations().get("agg");
  15. double max = agg.getMax();
  16. double min = agg.getMin();
  17. System.out.println(String.format("Max:%s Min: %s ", max, min));
  18. }

官方文档:https://www.elastic.co/guide/cn/elasticsearch/reference/index.html

ElasticSearch 实现分词全文检索 - 聚合查询 cardinality的更多相关文章

  1. Elasticsearch(8) --- 聚合查询(Metric聚合)

    Elasticsearch(8) --- 聚合查询(Metric聚合) 在Mysql中,我们可以获取一组数据的 最大值(Max).最小值(Min).同样我们能够对这组数据进行 分组(Group).那么 ...

  2. ElasticSearch的高级复杂查询:非聚合查询和聚合查询

    一.非聚合复杂查询(这儿展示了非聚合复杂查询的常用流程) 查询条件QueryBuilder的构建方法 1.1 精确查询(必须完全匹配上,相当于SQL语句中的“=”) ① 单个匹配 termQuery ...

  3. java整合Elasticsearch,实现crud以及高级查询的分页,范围,排序功能,泰文分词器的使用,分组,最大,最小,平均值,以及自动补全功能

    //为index创建mapping,index相当于mysql的数据库,数据库里的表也要给各个字段创建类型,所以index也要给字段事先设置好类型: 使用postMan或者其他工具创建:(此处我使用p ...

  4. ElasticSearch 6.2 Mapping参数说明及text类型字段聚合查询配置

    背景: 由于本人使用的是6.0以上的版本es,在使用发现很多中文博客对于mapping参数的说明已过时.ES6.0以后有很多参数变化. 现我根据官网总结mapping最新的参数,希望能对大家有用处. ...

  5. Spring Data Elasticsearch 聚合查询

    如需要统计某件商品的数量,最高价格,最低价格等就用到了聚合查询,就像数据库中的group by 首先需要注入ElasticsearchTemplate @Autowired private Elast ...

  6. Elasticsearch系列---聚合查询原理

    概要 本篇主要介绍聚合查询的内部原理,正排索引是如何建立的和优化的,fielddata的使用,最后简单介绍了聚合分析时如何选用深度优先和广度优先. 正排索引 聚合查询的内部原理是什么,Elastich ...

  7. Elasticsearch使用系列-基本查询和聚合查询+sql插件

    Elasticsearch使用系列-ES简介和环境搭建 Elasticsearch使用系列-ES增删查改基本操作+ik分词 Elasticsearch使用系列-基本查询和聚合查询+sql插件 Elas ...

  8. java使用elasticsearch分组进行聚合查询(group by)-项目中实际应用

    java连接elasticsearch 进行聚合查询进行相应操作 一:对单个字段进行分组求和 1.表结构图片: 根据任务id分组,分别统计出每个任务id下有多少个文字标题 .SQL:select id ...

  9. Elasticsearch(9) --- 聚合查询(Bucket聚合)

    Elasticsearch(9) --- 聚合查询(Bucket聚合) 上一篇讲了Elasticsearch聚合查询中的Metric聚合:Elasticsearch(8) --- 聚合查询(Metri ...

  10. ElasticSearch实战系列五: ElasticSearch的聚合查询基础使用教程之度量(Metric)聚合

    Title:ElasticSearch实战系列四: ElasticSearch的聚合查询基础使用教程之度量(Metric)聚合 前言 在上上一篇中介绍了ElasticSearch实战系列三: Elas ...

随机推荐

  1. 20202411 2020-2021-2 《Python程序设计》实验三报告

    20202411 2020-2021-2 <Python程序设计>实验三报告 课程:<Python程序设计> 班级: 2024 姓名: 陈书桓 学号:20202411 实验教师 ...

  2. Win32游戏开发程序——第一个“游戏”程序

    在中国大学慕课上面看到的一道题目,算得上是入门吧. 题目如下: 在"HelloWorldGame"游戏代码的基础上,试着进行如下的上机练习(能实现至少一个即可): •  将文字修改 ...

  3. centos7的mysql主从

    互为主从关闭两台虚拟机的防火墙1.yum -y install mariadb-server mariadb2.Systemctl start mariadb3.进入配置文件:vi /etc/my.c ...

  4. 前端通过input 输入框实现动态添加行 , 键盘上下左右点击可同步操作中心位置

    1. input 代码 ,我们项目组的input封装了,不过不影响使用 通过 @keyup 事件绑定show方法,需要将当前行的信息以及index传递,方便操作 另外要单独给这些需要操作的输入框添加c ...

  5. NS-Atmosphere payload Programmer

    NS-Atmosphere payload Programmer 通过该软件将任意payload烧写到NS-Atmosphere 注入器中, 兼容windows, ubuntu, 苹果 MAC OS ...

  6. base64格式上传图片方法

    function dataURItoBlob(dataURI) { const byteString = atob(dataURI.split(',')[1]); const mimeString = ...

  7. Java中内部类相关知识

    内部类 1.1内部类概述 内部类就是指在一个类中定义一个类.举例:在一个类A的内部定义了一个类B,类B就称为内部类. 1.1.1内部类的定义格式 格式: ​ public class 类名{ ​ 修饰 ...

  8. sql server 计算时间差的一部分函数【转】

    在做Sql Server开发的时候有时需要获取表中今天.昨天.本周.上周.本月.上月等数据,这时候就需要使用DATEDIFF()函数及GetDate()函数了.DATEDIFF ( datepart ...

  9. (三).JavaScript的分支结构和循环结构

    1. 分支结构 1.1 分支语句之单分支 ①.语法: if(值,如果不是布尔值会强制转换成布尔值) { 代码块; } ②.案例: // 案例:如果a变量的值加键盘上输入的数大于100,就打印我爱你二狗 ...

  10. MySQL_GTID主从同步排错

    1 在Master上 查询gtid后,记录gtid_executed 返回的值 mysql> show global variables like '%gtid%'\G ************ ...