Java+springboot+elasticsearch7.6.2实现分组查询(平级+层级)并实现script多字段拼接查询以及大于小于等条件关系查询的实现

Time Series Databases Time Series Databases 本文为自己学习该篇论文所记的笔记,主要是一些术语的记录及解释 阅读详情

Java+springboot+elasticsearch7.6.2实现分组查询(平级+层级)并实现script多字段拼接查询

简介:关于elasticsearch的“层级”聚合,百度一下有一大堆文章。这里不再啰嗦了,由于百度了三个小时,也没找到我想要的"平级"查询的方法,最后还是自己研究源码整除来的,其实就是那么那么简单,只是没有例子,就不好整。上干货。

注:对es里的专业用语不熟,所以这里用的"平级","层级"两个测只是形象词语,不是es专业叫法。。。知道叫法的请留言告知。

 

目录

Java+springboot+elasticsearch7.6.2实现分组查询(平级+层级)并实现script多字段拼接查询

第一步、 实现平级搜索。

第二部、实现平级+层级分组聚合

第三部、script实现多字段查询

四、分词的字段做聚合

五、实践代码


 

第一步、 实现平级搜索。

先看一下,测试数据的数据结构:

kibana:

GET ermsftrv1/_search
{
  "query": {
    "match_all": {}
  }
}

结果:

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 6,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "ermsftrv1",
        "_type" : "_doc",
        "_id" : "6502586031240448",
        "_score" : 1.0,
        "_source" : {
          "annual" : "",
          "archName" : "新建文本文档",
          "archNo" : "0022-SB0000.TODO-TODO-001",
          "archTypeCode" : "SB0000",
          "archTypeId" : "6485930821313792",
          "archTypeName" : "设备仪器",
          "archivedDate" : 1587545484000,
          "archivedDep" : "1753-11-11 00:00:00",
          "archivedOperator" : "",
          "documentPage" : 0,
          "entityTypeId" : 1,
          "expDate" : -6820704000000,
          "fileNo" : "",
          "handlerId" : 6502586302145792,
          "id" : "6502586031240448",
          "pageNum" : "0",
          "picPage" : 0,
          "responsibleDept" : "",
          "responsibleOper" : "hanfeixian",
          "savePeriod" : "永久",
          "savePeriodId" : "1",
          "secret" : "普通商密",
          "secretExpDate" : 1650556800000,
          "secretId" : "2",
          "secretPeriodId" : 1,
          "sectId" : "6480640146142464",
          "sectName" : "新奥集团档案局",
          "sectNo" : "A0022",
          "thridId" : "A0022-2020-0000000722",
          "writingDate" : 1650556800000,
          "year" : "2020"
        }
      },
      {
        "_index" : "ermsftrv1",
        "_type" : "_doc",
        "_id" : "6500384144856320",
        "_score" : 1.0,
        "_source" : {
          "annual" : "",
          "archName" : "问题",
          "archNo" : "0022-JS0000-TODO.-TODO-027",
          "archTypeCode" : "JS0000",
          "archTypeId" : "6485924961527040",
          "archTypeName" : "建设项目",
          "archivedDate" : 1587548214000,
          "archivedDep" : "1753-11-11 00:00:00",
          "archivedOperator" : "",
          "documentPage" : 0,
          "entityTypeId" : 1,
          "expDate" : -6820704000000,
          "fileNo" : "",
          "handlerId" : 6502597485647104,
          "id" : "6500384144856320",
          "pageNum" : "1",
          "picPage" : 0,
          "responsibleDept" : "",
          "responsibleOper" : "hanfeixian",
          "savePeriod" : "永久",
          "savePeriodId" : "1",
          "secret" : "普通商密",
          "secretExpDate" : 1650038400000,
          "secretId" : "2",
          "secretPeriodId" : 9,
          "sectId" : "6480640146142464",
          "sectName" : "新奥集团档案局",
          "sectNo" : "A0022",
          "thridId" : "A0022-2020-0000000723",
          "writingDate" : 1650038400000,
          "year" : "2020"
        }
      },
      {
        "_index" : "ermsftrv1",
        "_type" : "_doc",
        "_id" : "6503214760639744",
        "_score" : 1.0,
        "_source" : {
          "annual" : "2020",
          "archName" : "曹操出行-2行程单",
          "archNo" : "0022-ZZ0100.TODO-03-006",
          "archTypeCode" : "ZZ0100",
          "archTypeId" : "6489894262050048",
          "archTypeName" : "01 企业证照",
          "archivedDate" : 1587699428000,
          "archivedDep" : "1753-11-11 00:00:00",
          "archivedOperator" : "",
          "documentPage" : 0,
          "entityTypeId" : 1,
          "expDate" : -6820704000000,
          "fileNo" : "",
          "handlerId" : 6503216857251072,
          "id" : "6503214760639744",
          "pageNum" : "0",
          "picPage" : 0,
          "responsibleDept" : "",
          "responsibleOper" : "zhangjunk",
          "savePeriod" : "30年",
          "savePeriodId" : "3",
          "secret" : "核心商密",
          "secretExpDate" : 1638633600000,
          "secretId" : "3",
          "secretPeriodId" : 1,
          "sectId" : "6480626827621632",
          "sectName" : "新奥集团股份有限公司",
          "sectNo" : "A0022",
          "thridId" : "A0022-2020-0000000187",
          "writingDate" : 1638633600000,
          "year" : "2020"
        }
      },
      {
        "_index" : "ermsftrv1",
        "_type" : "_doc",
        "_id" : "6503218290695424",
        "_score" : 1.0,
        "_source" : {
          "annual" : "",
          "archName" : "消息接入规范",
          "archNo" : "0022-ZZ0200.TODO-K093-002",
          "archTypeCode" : "ZZ0200",
          "archTypeId" : "6495573858862336",
          "archTypeName" : "02 领导证照",
          "archivedDate" : 1587709784000,
          "archivedDep" : "1753-11-11 00:00:00",
          "archivedOperator" : "",
          "documentPage" : 0,
          "entityTypeId" : 2,
          "expDate" : 1619258366000,
          "fileNo" : "",
          "handlerId" : 6503218290752768,
          "id" : "6503218290695424",
          "pageNum" : "0",
          "picPage" : 0,
          "responsibleDept" : "",
          "responsibleOper" : "zhangjunk",
          "savePeriod" : "永久",
          "savePeriodId" : "1",
          "secret" : "核心商密",
          "secretExpDate" : 1808560781000,
          "secretId" : "3",
          "secretPeriodId" : 7,
          "sectId" : "6480626827621632",
          "sectName" : "新奥集团股份有限公司",
          "sectNo" : "A0022",
          "thridId" : "A0022-2020-0000000318",
          "writingDate" : 1584547200000,
          "year" : "2020"
        }
      },
      {
        "_index" : "ermsftrv1",
        "_type" : "_doc",
        "_id" : "6503265140862208",
        "_score" : 1.0,
        "_source" : {
          "annual" : "",
          "archName" : "新奥档案系统-项目进度计划-20200408",
          "archNo" : "0022-ZZ0200.TODO-null-010",
          "archTypeCode" : "ZZ0200",
          "archTypeId" : "6495573858862336",
          "archTypeName" : "02 领导证照",
          "archivedDate" : 1587711282000,
          "archivedDep" : "1753-11-11 00:00:00",
          "archivedOperator" : "",
          "documentPage" : 0,
          "entityTypeId" : 1,
          "expDate" : -6820704000000,
          "fileNo" : "",
          "handlerId" : 6503265140927744,
          "id" : "6503265140862208",
          "pageNum" : "0",
          "picPage" : 0,
          "responsibleDept" : "",
          "responsibleOper" : "zhangjunk",
          "savePeriod" : "永久",
          "savePeriodId" : "1",
          "secret" : "核心商密",
          "secretExpDate" : 1649347200000,
          "secretId" : "3",
          "secretPeriodId" : 1,
          "sectId" : "6480640146142464",
          "sectName" : "新奥集团档案局",
          "sectNo" : "A0022",
          "thridId" : "A0022-2020-0000000768",
          "writingDate" : 1649347200000,
          "year" : "2020"
        }
      },
      {
        "_index" : "ermsftrv1",
        "_type" : "_doc",
        "_id" : "6503265140526336",
        "_score" : 1.0,
        "_source" : {
          "annual" : "",
          "archName" : "新奥档案系统-项目进度计划-20200415",
          "archNo" : "0022-ZZ0200.TODO-null-011",
          "archTypeCode" : "ZZ0200",
          "archTypeId" : "6495573858862336",
          "archTypeName" : "02 领导证照",
          "archivedDate" : 1587711282000,
          "archivedDep" : "1753-11-11 00:00:00",
          "archivedOperator" : "",
          "documentPage" : 0,
          "entityTypeId" : 1,
          "expDate" : -6820704000000,
          "fileNo" : "",
          "handlerId" : 6503265411443968,
          "id" : "6503265140526336",
          "pageNum" : "0",
          "picPage" : 0,
          "responsibleDept" : "",
          "responsibleOper" : "zhangjunk",
          "savePeriod" : "永久",
          "savePeriodId" : "1",
          "secret" : "普通商密",
          "secretExpDate" : 1650384000000,
          "secretId" : "2",
          "secretPeriodId" : 1,
          "sectId" : "6480640146142464",
          "sectName" : "新奥集团档案局",
          "sectNo" : "A0022",
          "thridId" : "A0022-2020-0000000769",
          "writingDate" : 1650384000000,
          "year" : "2020"
        }
      }
    ]
  }
}

实现archTypeId和year做聚合实现平级分组。

kibana:

POST ermsftrv1/_search
{
  "aggs": {
    "archTypeGroup": {
      "terms": {
        "field": "archTypeId.keyword",
        "size": 10
      }
    },
    "yearGroup": {
      "terms": {
        "field": "year.keyword",
        "size": 10
      }
    }
  }
}

结果:

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 6,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "ermsftrv1",
        "_type" : "_doc",
        "_id" : "6502586031240448",
        "_score" : 1.0,
        "_source" : {
          "annual" : "",
          "archName" : "新建文本文档",
          "archNo" : "0022-SB0000.TODO-TODO-001",
          "archTypeCode" : "SB0000",
          "archTypeId" : "6485930821313792",
          "archTypeName" : "设备仪器",
          "archivedDate" : 1587545484000,
          "archivedDep" : "1753-11-11 00:00:00",
          "archivedOperator" : "",
          "documentPage" : 0,
          "entityTypeId" : 1,
          "expDate" : -6820704000000,
          "fileNo" : "",
          "handlerId" : 6502586302145792,
          "id" : "6502586031240448",
          "pageNum" : "0",
          "picPage" : 0,
          "responsibleDept" : "",
          "responsibleOper" : "hanfeixian",
          "savePeriod" : "永久",
          "savePeriodId" : "1",
          "secret" : "普通商密",
          "secretExpDate" : 1650556800000,
          "secretId" : "2",
          "secretPeriodId" : 1,
          "sectId" : "6480640146142464",
          "sectName" : "新奥集团档案局",
          "sectNo" : "A0022",
          "thridId" : "A0022-2020-0000000722",
          "writingDate" : 1650556800000,
          "year" : "2020"
        }
      },
      {
        "_index" : "ermsftrv1",
        "_type" : "_doc",
        "_id" : "6500384144856320",
        "_score" : 1.0,
        "_source" : {
          "annual" : "",
          "archName" : "问题",
          "archNo" : "0022-JS0000-TODO.-TODO-027",
          "archTypeCode" : "JS0000",
          "archTypeId" : "6485924961527040",
          "archTypeName" : "建设项目",
          "archivedDate" : 1587548214000,
          "archivedDep" : "1753-11-11 00:00:00",
          "archivedOperator" : "",
          "documentPage" : 0,
          "entityTypeId" : 1,
          "expDate" : -6820704000000,
          "fileNo" : "",
          "handlerId" : 6502597485647104,
          "id" : "6500384144856320",
          "pageNum" : "1",
          "picPage" : 0,
          "responsibleDept" : "",
          "responsibleOper" : "hanfeixian",
          "savePeriod" : "永久",
          "savePeriodId" : "1",
          "secret" : "普通商密",
          "secretExpDate" : 1650038400000,
          "secretId" : "2",
          "secretPeriodId" : 9,
          "sectId" : "6480640146142464",
          "sectName" : "新奥集团档案局",
          "sectNo" : "A0022",
          "thridId" : "A0022-2020-0000000723",
          "writingDate" : 1650038400000,
          "year" : "2020"
        }
      },
      {
        "_index" : "ermsftrv1",
        "_type" : "_doc",
        "_id" : "6503214760639744",
        "_score" : 1.0,
        "_source" : {
          "annual" : "2020",
          "archName" : "曹操出行-2行程单",
          "archNo" : "0022-ZZ0100.TODO-03-006",
          "archTypeCode" : "ZZ0100",
          "archTypeId" : "6489894262050048",
          "archTypeName" : "01 企业证照",
          "archivedDate" : 1587699428000,
          "archivedDep" : "1753-11-11 00:00:00",
          "archivedOperator" : "",
          "documentPage" : 0,
          "entityTypeId" : 1,
          "expDate" : -6820704000000,
          "fileNo" : "",
          "handlerId" : 6503216857251072,
          "id" : "6503214760639744",
          "pageNum" : "0",
          "picPage" : 0,
          "responsibleDept" : "",
          "responsibleOper" : "zhangjunk",
          "savePeriod" : "30年",
          "savePeriodId" : "3",
          "secret" : "核心商密",
          "secretExpDate" : 1638633600000,
          "secretId" : "3",
          "secretPeriodId" : 1,
          "sectId" : "6480626827621632",
          "sectName" : "新奥集团股份有限公司",
          "sectNo" : "A0022",
          "thridId" : "A0022-2020-0000000187",
          "writingDate" : 1638633600000,
          "year" : "2020"
        }
      },
      {
        "_index" : "ermsftrv1",
        "_type" : "_doc",
        "_id" : "6503218290695424",
        "_score" : 1.0,
        "_source" : {
          "annual" : "",
          "archName" : "消息接入规范",
          "archNo" : "0022-ZZ0200.TODO-K093-002",
          "archTypeCode" : "ZZ0200",
          "archTypeId" : "6495573858862336",
          "archTypeName" : "02 领导证照",
          "archivedDate" : 1587709784000,
          "archivedDep" : "1753-11-11 00:00:00",
          "archivedOperator" : "",
          "documentPage" : 0,
          "entityTypeId" : 2,
          "expDate" : 1619258366000,
          "fileNo" : "",
          "handlerId" : 6503218290752768,
          "id" : "6503218290695424",
          "pageNum" : "0",
          "picPage" : 0,
          "responsibleDept" : "",
          "responsibleOper" : "zhangjunk",
          "savePeriod" : "永久",
          "savePeriodId" : "1",
          "secret" : "核心商密",
          "secretExpDate" : 1808560781000,
          "secretId" : "3",
          "secretPeriodId" : 7,
          "sectId" : "6480626827621632",
          "sectName" : "新奥集团股份有限公司",
          "sectNo" : "A0022",
          "thridId" : "A0022-2020-0000000318",
          "writingDate" : 1584547200000,
          "year" : "2020"
        }
      },
      {
        "_index" : "ermsftrv1",
        "_type" : "_doc",
        "_id" : "6503265140862208",
        "_score" : 1.0,
        "_source" : {
          "annual" : "",
          "archName" : "新奥档案系统-项目进度计划-20200408",
          "archNo" : "0022-ZZ0200.TODO-null-010",
          "archTypeCode" : "ZZ0200",
          "archTypeId" : "6495573858862336",
          "archTypeName" : "02 领导证照",
          "archivedDate" : 1587711282000,
          "archivedDep" : "1753-11-11 00:00:00",
          "archivedOperator" : "",
          "documentPage" : 0,
          "entityTypeId" : 1,
          "expDate" : -6820704000000,
          "fileNo" : "",
          "handlerId" : 6503265140927744,
          "id" : "6503265140862208",
          "pageNum" : "0",
          "picPage" : 0,
          "responsibleDept" : "",
          "responsibleOper" : "zhangjunk",
          "savePeriod" : "永久",
          "savePeriodId" : "1",
          "secret" : "核心商密",
          "secretExpDate" : 1649347200000,
          "secretId" : "3",
          "secretPeriodId" : 1,
          "sectId" : "6480640146142464",
          "sectName" : "新奥集团档案局",
          "sectNo" : "A0022",
          "thridId" : "A0022-2020-0000000768",
          "writingDate" : 1649347200000,
          "year" : "2020"
        }
      },
      {
        "_index" : "ermsftrv1",
        "_type" : "_doc",
        "_id" : "6503265140526336",
        "_score" : 1.0,
        "_source" : {
          "annual" : "",
          "archName" : "新奥档案系统-项目进度计划-20200415",
          "archNo" : "0022-ZZ0200.TODO-null-011",
          "archTypeCode" : "ZZ0200",
          "archTypeId" : "6495573858862336",
          "archTypeName" : "02 领导证照",
          "archivedDate" : 1587711282000,
          "archivedDep" : "1753-11-11 00:00:00",
          "archivedOperator" : "",
          "documentPage" : 0,
          "entityTypeId" : 1,
          "expDate" : -6820704000000,
          "fileNo" : "",
          "handlerId" : 6503265411443968,
          "id" : "6503265140526336",
          "pageNum" : "0",
          "picPage" : 0,
          "responsibleDept" : "",
          "responsibleOper" : "zhangjunk",
          "savePeriod" : "永久",
          "savePeriodId" : "1",
          "secret" : "普通商密",
          "secretExpDate" : 1650384000000,
          "secretId" : "2",
          "secretPeriodId" : 1,
          "sectId" : "6480640146142464",
          "sectName" : "新奥集团档案局",
          "sectNo" : "A0022",
          "thridId" : "A0022-2020-0000000769",
          "writingDate" : 1650384000000,
          "year" : "2020"
        }
      }
    ]
  },
  "aggregations" : {
    "yearGroup" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "2020",
          "doc_count" : 6
        }
      ]
    },
    "archTypeGroup" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "6495573858862336",
          "doc_count" : 3
        },
        {
          "key" : "6485924961527040",
          "doc_count" : 1
        },
        {
          "key" : "6485930821313792",
          "doc_count" : 1
        },
        {
          "key" : "6489894262050048",
          "doc_count" : 1
        }
      ]
    }
  }
}

java springboot实现:

SearchRequest searchRequest = new SearchRequest(ermsesProperties.getIndex());
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();            
//第一个字段进行分组
TermsAggregationBuilder yearGroupAgg = AggregationBuilders.terms("yearGroup").field("year.keyword");
//根据第二个字段进行分组
TermsAggregationBuilder archTypeGroupAgg = AggregationBuilders.terms("archTypeGroup").field("archTypeId.keyword");
//如果存在第三个,以此类推...
//只需要平级添加聚合条件即可
sourceBuilder.aggregation(yearGroupAgg);
sourceBuilder.aggregation(archTypeGroupAgg);
searchRequest.source(sourceBuilder);

第二部、实现平级+层级分组聚合

实现archTypeId和year做聚合实现平级分组,同时实现archTypeId和secret层级聚合分组(也是百度中大篇幅的层级聚合分组)。

kibana:

POST ermsftrv1/_search
{
  "aggs": {
    "archTypeGroup": {
      "terms": {
        "field": "archTypeId.keyword",
        "size": 10
      },
      "aggs": {
        "secretGroup": {
          "terms": {
            "field": "secret.keyword"
          }
        }
      }
    },
    "yearGroup": {
      "terms": {
        "field": "year.keyword",
        "size": 10
      }
    }
  }
}

结果:

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 6,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "ermsftrv1",
        "_type" : "_doc",
        "_id" : "6502586031240448",
        "_score" : 1.0,
        "_source" : {
          "annual" : "",
          "archName" : "新建文本文档",
          "archNo" : "0022-SB0000.TODO-TODO-001",
          "archTypeCode" : "SB0000",
          "archTypeId" : "6485930821313792",
          "archTypeName" : "设备仪器",
          "archivedDate" : 1587545484000,
          "archivedDep" : "1753-11-11 00:00:00",
          "archivedOperator" : "",
          "documentPage" : 0,
          "entityTypeId" : 1,
          "expDate" : -6820704000000,
          "fileNo" : "",
          "handlerId" : 6502586302145792,
          "id" : "6502586031240448",
          "pageNum" : "0",
          "picPage" : 0,
          "responsibleDept" : "",
          "responsibleOper" : "hanfeixian",
          "savePeriod" : "永久",
          "savePeriodId" : "1",
          "secret" : "普通商密",
          "secretExpDate" : 1650556800000,
          "secretId" : "2",
          "secretPeriodId" : 1,
          "sectId" : "6480640146142464",
          "sectName" : "新奥集团档案局",
          "sectNo" : "A0022",
          "thridId" : "A0022-2020-0000000722",
          "writingDate" : 1650556800000,
          "year" : "2020"
        }
      },
      {
        "_index" : "ermsftrv1",
        "_type" : "_doc",
        "_id" : "6500384144856320",
        "_score" : 1.0,
        "_source" : {
          "annual" : "",
          "archName" : "问题",
          "archNo" : "0022-JS0000-TODO.-TODO-027",
          "archTypeCode" : "JS0000",
          "archTypeId" : "6485924961527040",
          "archTypeName" : "建设项目",
          "archivedDate" : 1587548214000,
          "archivedDep" : "1753-11-11 00:00:00",
          "archivedOperator" : "",
          "documentPage" : 0,
          "entityTypeId" : 1,
          "expDate" : -6820704000000,
          "fileNo" : "",
          "handlerId" : 6502597485647104,
          "id" : "6500384144856320",
          "pageNum" : "1",
          "picPage" : 0,
          "responsibleDept" : "",
          "responsibleOper" : "hanfeixian",
          "savePeriod" : "永久",
          "savePeriodId" : "1",
          "secret" : "普通商密",
          "secretExpDate" : 1650038400000,
          "secretId" : "2",
          "secretPeriodId" : 9,
          "sectId" : "6480640146142464",
          "sectName" : "新奥集团档案局",
          "sectNo" : "A0022",
          "thridId" : "A0022-2020-0000000723",
          "writingDate" : 1650038400000,
          "year" : "2020"
        }
      },
      {
        "_index" : "ermsftrv1",
        "_type" : "_doc",
        "_id" : "6503214760639744",
        "_score" : 1.0,
        "_source" : {
          "annual" : "2020",
          "archName" : "曹操出行-2行程单",
          "archNo" : "0022-ZZ0100.TODO-03-006",
          "archTypeCode" : "ZZ0100",
          "archTypeId" : "6489894262050048",
          "archTypeName" : "01 企业证照",
          "archivedDate" : 1587699428000,
          "archivedDep" : "1753-11-11 00:00:00",
          "archivedOperator" : "",
          "documentPage" : 0,
          "entityTypeId" : 1,
          "expDate" : -6820704000000,
          "fileNo" : "",
          "handlerId" : 6503216857251072,
          "id" : "6503214760639744",
          "pageNum" : "0",
          "picPage" : 0,
          "responsibleDept" : "",
          "responsibleOper" : "zhangjunk",
          "savePeriod" : "30年",
          "savePeriodId" : "3",
          "secret" : "核心商密",
          "secretExpDate" : 1638633600000,
          "secretId" : "3",
          "secretPeriodId" : 1,
          "sectId" : "6480626827621632",
          "sectName" : "新奥集团股份有限公司",
          "sectNo" : "A0022",
          "thridId" : "A0022-2020-0000000187",
          "writingDate" : 1638633600000,
          "year" : "2020"
        }
      },
      {
        "_index" : "ermsftrv1",
        "_type" : "_doc",
        "_id" : "6503218290695424",
        "_score" : 1.0,
        "_source" : {
          "annual" : "",
          "archName" : "消息接入规范",
          "archNo" : "0022-ZZ0200.TODO-K093-002",
          "archTypeCode" : "ZZ0200",
          "archTypeId" : "6495573858862336",
          "archTypeName" : "02 领导证照",
          "archivedDate" : 1587709784000,
          "archivedDep" : "1753-11-11 00:00:00",
          "archivedOperator" : "",
          "documentPage" : 0,
          "entityTypeId" : 2,
          "expDate" : 1619258366000,
          "fileNo" : "",
          "handlerId" : 6503218290752768,
          "id" : "6503218290695424",
          "pageNum" : "0",
          "picPage" : 0,
          "responsibleDept" : "",
          "responsibleOper" : "zhangjunk",
          "savePeriod" : "永久",
          "savePeriodId" : "1",
          "secret" : "核心商密",
          "secretExpDate" : 1808560781000,
          "secretId" : "3",
          "secretPeriodId" : 7,
          "sectId" : "6480626827621632",
          "sectName" : "新奥集团股份有限公司",
          "sectNo" : "A0022",
          "thridId" : "A0022-2020-0000000318",
          "writingDate" : 1584547200000,
          "year" : "2020"
        }
      },
      {
        "_index" : "ermsftrv1",
        "_type" : "_doc",
        "_id" : "6503265140862208",
        "_score" : 1.0,
        "_source" : {
          "annual" : "",
          "archName" : "新奥档案系统-项目进度计划-20200408",
          "archNo" : "0022-ZZ0200.TODO-null-010",
          "archTypeCode" : "ZZ0200",
          "archTypeId" : "6495573858862336",
          "archTypeName" : "02 领导证照",
          "archivedDate" : 1587711282000,
          "archivedDep" : "1753-11-11 00:00:00",
          "archivedOperator" : "",
          "documentPage" : 0,
          "entityTypeId" : 1,
          "expDate" : -6820704000000,
          "fileNo" : "",
          "handlerId" : 6503265140927744,
          "id" : "6503265140862208",
          "pageNum" : "0",
          "picPage" : 0,
          "responsibleDept" : "",
          "responsibleOper" : "zhangjunk",
          "savePeriod" : "永久",
          "savePeriodId" : "1",
          "secret" : "核心商密",
          "secretExpDate" : 1649347200000,
          "secretId" : "3",
          "secretPeriodId" : 1,
          "sectId" : "6480640146142464",
          "sectName" : "新奥集团档案局",
          "sectNo" : "A0022",
          "thridId" : "A0022-2020-0000000768",
          "writingDate" : 1649347200000,
          "year" : "2020"
        }
      },
      {
        "_index" : "ermsftrv1",
        "_type" : "_doc",
        "_id" : "6503265140526336",
        "_score" : 1.0,
        "_source" : {
          "annual" : "",
          "archName" : "新奥档案系统-项目进度计划-20200415",
          "archNo" : "0022-ZZ0200.TODO-null-011",
          "archTypeCode" : "ZZ0200",
          "archTypeId" : "6495573858862336",
          "archTypeName" : "02 领导证照",
          "archivedDate" : 1587711282000,
          "archivedDep" : "1753-11-11 00:00:00",
          "archivedOperator" : "",
          "documentPage" : 0,
          "entityTypeId" : 1,
          "expDate" : -6820704000000,
          "fileNo" : "",
          "handlerId" : 6503265411443968,
          "id" : "6503265140526336",
          "pageNum" : "0",
          "picPage" : 0,
          "responsibleDept" : "",
          "responsibleOper" : "zhangjunk",
          "savePeriod" : "永久",
          "savePeriodId" : "1",
          "secret" : "普通商密",
          "secretExpDate" : 1650384000000,
          "secretId" : "2",
          "secretPeriodId" : 1,
          "sectId" : "6480640146142464",
          "sectName" : "新奥集团档案局",
          "sectNo" : "A0022",
          "thridId" : "A0022-2020-0000000769",
          "writingDate" : 1650384000000,
          "year" : "2020"
        }
      }
    ]
  },
  "aggregations" : {
    "yearGroup" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "2020",
          "doc_count" : 6
        }
      ]
    },
    "archTypeGroup" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "6495573858862336",
          "doc_count" : 3,
          "secretGroup" : {
            "doc_count_error_upper_bound" : 0,
            "sum_other_doc_count" : 0,
            "buckets" : [
              {
                "key" : "核心商密",
                "doc_count" : 2
              },
              {
                "key" : "普通商密",
                "doc_count" : 1
              }
            ]
          }
        },
        {
          "key" : "6485924961527040",
          "doc_count" : 1,
          "secretGroup" : {
            "doc_count_error_upper_bound" : 0,
            "sum_other_doc_count" : 0,
            "buckets" : [
              {
                "key" : "普通商密",
                "doc_count" : 1
              }
            ]
          }
        },
        {
          "key" : "6485930821313792",
          "doc_count" : 1,
          "secretGroup" : {
            "doc_count_error_upper_bound" : 0,
            "sum_other_doc_count" : 0,
            "buckets" : [
              {
                "key" : "普通商密",
                "doc_count" : 1
              }
            ]
          }
        },
        {
          "key" : "6489894262050048",
          "doc_count" : 1,
          "secretGroup" : {
            "doc_count_error_upper_bound" : 0,
            "sum_other_doc_count" : 0,
            "buckets" : [
              {
                "key" : "核心商密",
                "doc_count" : 1
              }
            ]
          }
        }
      ]
    }
  }
}

java实现:

SearchRequest searchRequest = new SearchRequest(ermsesProperties.getIndex());
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();            
//第一个字段进行分组
TermsAggregationBuilder yearGroupAgg = AggregationBuilders.terms("yearGroup").field("year.keyword");
//根据第二个字段进行分组
TermsAggregationBuilder archTypeGroupAgg = AggregationBuilders.terms("archTypeGroup").field("archTypeId.keyword");
//自己聚合分组,生命方式一样
TermsAggregationBuilder secretGroup = AggregationBuilders.terms("secretGroup").field("secret.keyword");
//只需要平级添加聚合条件即可
sourceBuilder.aggregation(yearGroupAgg);
//设置聚合分组时,同事设置子分组(子层级)
sourceBuilder.aggregation(archTypeGroupAgg.subAggregation(secretGroup));
searchRequest.source(sourceBuilder);

第三部、script实现多字段查询

实现archTypeId和year平级聚合分组,同事查询出archTypeId对应的中文名称archTypeName。其中#split#是自定义的。

kibana:

POST ermsftrv1/_search
{
  "aggs": {
    "archTypeGroup": {
      "terms": {
        "script": "doc['archTypeId.keyword'].value +'#split#'+ doc['archTypeName.keyword'].value",
        "size": 10
      }
    },
    "yearGroup": {
      "terms": {
        "field": "year.keyword",
        "size": 10
      }
    }
  }
}

结果:

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 6,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "ermsftrv1",
        "_type" : "_doc",
        "_id" : "6502586031240448",
        "_score" : 1.0,
        "_source" : {
          "annual" : "",
          "archName" : "新建文本文档",
          "archNo" : "0022-SB0000.TODO-TODO-001",
          "archTypeCode" : "SB0000",
          "archTypeId" : "6485930821313792",
          "archTypeName" : "设备仪器",
          "archivedDate" : 1587545484000,
          "archivedDep" : "1753-11-11 00:00:00",
          "archivedOperator" : "",
          "documentPage" : 0,
          "entityTypeId" : 1,
          "expDate" : -6820704000000,
          "fileNo" : "",
          "handlerId" : 6502586302145792,
          "id" : "6502586031240448",
          "pageNum" : "0",
          "picPage" : 0,
          "responsibleDept" : "",
          "responsibleOper" : "hanfeixian",
          "savePeriod" : "永久",
          "savePeriodId" : "1",
          "secret" : "普通商密",
          "secretExpDate" : 1650556800000,
          "secretId" : "2",
          "secretPeriodId" : 1,
          "sectId" : "6480640146142464",
          "sectName" : "新奥集团档案局",
          "sectNo" : "A0022",
          "thridId" : "A0022-2020-0000000722",
          "writingDate" : 1650556800000,
          "year" : "2020"
        }
      },
      {
        "_index" : "ermsftrv1",
        "_type" : "_doc",
        "_id" : "6500384144856320",
        "_score" : 1.0,
        "_source" : {
          "annual" : "",
          "archName" : "问题",
          "archNo" : "0022-JS0000-TODO.-TODO-027",
          "archTypeCode" : "JS0000",
          "archTypeId" : "6485924961527040",
          "archTypeName" : "建设项目",
          "archivedDate" : 1587548214000,
          "archivedDep" : "1753-11-11 00:00:00",
          "archivedOperator" : "",
          "documentPage" : 0,
          "entityTypeId" : 1,
          "expDate" : -6820704000000,
          "fileNo" : "",
          "handlerId" : 6502597485647104,
          "id" : "6500384144856320",
          "pageNum" : "1",
          "picPage" : 0,
          "responsibleDept" : "",
          "responsibleOper" : "hanfeixian",
          "savePeriod" : "永久",
          "savePeriodId" : "1",
          "secret" : "普通商密",
          "secretExpDate" : 1650038400000,
          "secretId" : "2",
          "secretPeriodId" : 9,
          "sectId" : "6480640146142464",
          "sectName" : "新奥集团档案局",
          "sectNo" : "A0022",
          "thridId" : "A0022-2020-0000000723",
          "writingDate" : 1650038400000,
          "year" : "2020"
        }
      },
      {
        "_index" : "ermsftrv1",
        "_type" : "_doc",
        "_id" : "6503214760639744",
        "_score" : 1.0,
        "_source" : {
          "annual" : "2020",
          "archName" : "曹操出行-2行程单",
          "archNo" : "0022-ZZ0100.TODO-03-006",
          "archTypeCode" : "ZZ0100",
          "archTypeId" : "6489894262050048",
          "archTypeName" : "01 企业证照",
          "archivedDate" : 1587699428000,
          "archivedDep" : "1753-11-11 00:00:00",
          "archivedOperator" : "",
          "documentPage" : 0,
          "entityTypeId" : 1,
          "expDate" : -6820704000000,
          "fileNo" : "",
          "handlerId" : 6503216857251072,
          "id" : "6503214760639744",
          "pageNum" : "0",
          "picPage" : 0,
          "responsibleDept" : "",
          "responsibleOper" : "zhangjunk",
          "savePeriod" : "30年",
          "savePeriodId" : "3",
          "secret" : "核心商密",
          "secretExpDate" : 1638633600000,
          "secretId" : "3",
          "secretPeriodId" : 1,
          "sectId" : "6480626827621632",
          "sectName" : "新奥集团股份有限公司",
          "sectNo" : "A0022",
          "thridId" : "A0022-2020-0000000187",
          "writingDate" : 1638633600000,
          "year" : "2020"
        }
      },
      {
        "_index" : "ermsftrv1",
        "_type" : "_doc",
        "_id" : "6503218290695424",
        "_score" : 1.0,
        "_source" : {
          "annual" : "",
          "archName" : "消息接入规范",
          "archNo" : "0022-ZZ0200.TODO-K093-002",
          "archTypeCode" : "ZZ0200",
          "archTypeId" : "6495573858862336",
          "archTypeName" : "02 领导证照",
          "archivedDate" : 1587709784000,
          "archivedDep" : "1753-11-11 00:00:00",
          "archivedOperator" : "",
          "documentPage" : 0,
          "entityTypeId" : 2,
          "expDate" : 1619258366000,
          "fileNo" : "",
          "handlerId" : 6503218290752768,
          "id" : "6503218290695424",
          "pageNum" : "0",
          "picPage" : 0,
          "responsibleDept" : "",
          "responsibleOper" : "zhangjunk",
          "savePeriod" : "永久",
          "savePeriodId" : "1",
          "secret" : "核心商密",
          "secretExpDate" : 1808560781000,
          "secretId" : "3",
          "secretPeriodId" : 7,
          "sectId" : "6480626827621632",
          "sectName" : "新奥集团股份有限公司",
          "sectNo" : "A0022",
          "thridId" : "A0022-2020-0000000318",
          "writingDate" : 1584547200000,
          "year" : "2020"
        }
      },
      {
        "_index" : "ermsftrv1",
        "_type" : "_doc",
        "_id" : "6503265140862208",
        "_score" : 1.0,
        "_source" : {
          "annual" : "",
          "archName" : "新奥档案系统-项目进度计划-20200408",
          "archNo" : "0022-ZZ0200.TODO-null-010",
          "archTypeCode" : "ZZ0200",
          "archTypeId" : "6495573858862336",
          "archTypeName" : "02 领导证照",
          "archivedDate" : 1587711282000,
          "archivedDep" : "1753-11-11 00:00:00",
          "archivedOperator" : "",
          "documentPage" : 0,
          "entityTypeId" : 1,
          "expDate" : -6820704000000,
          "fileNo" : "",
          "handlerId" : 6503265140927744,
          "id" : "6503265140862208",
          "pageNum" : "0",
          "picPage" : 0,
          "responsibleDept" : "",
          "responsibleOper" : "zhangjunk",
          "savePeriod" : "永久",
          "savePeriodId" : "1",
          "secret" : "核心商密",
          "secretExpDate" : 1649347200000,
          "secretId" : "3",
          "secretPeriodId" : 1,
          "sectId" : "6480640146142464",
          "sectName" : "新奥集团档案局",
          "sectNo" : "A0022",
          "thridId" : "A0022-2020-0000000768",
          "writingDate" : 1649347200000,
          "year" : "2020"
        }
      },
      {
        "_index" : "ermsftrv1",
        "_type" : "_doc",
        "_id" : "6503265140526336",
        "_score" : 1.0,
        "_source" : {
          "annual" : "",
          "archName" : "新奥档案系统-项目进度计划-20200415",
          "archNo" : "0022-ZZ0200.TODO-null-011",
          "archTypeCode" : "ZZ0200",
          "archTypeId" : "6495573858862336",
          "archTypeName" : "02 领导证照",
          "archivedDate" : 1587711282000,
          "archivedDep" : "1753-11-11 00:00:00",
          "archivedOperator" : "",
          "documentPage" : 0,
          "entityTypeId" : 1,
          "expDate" : -6820704000000,
          "fileNo" : "",
          "handlerId" : 6503265411443968,
          "id" : "6503265140526336",
          "pageNum" : "0",
          "picPage" : 0,
          "responsibleDept" : "",
          "responsibleOper" : "zhangjunk",
          "savePeriod" : "永久",
          "savePeriodId" : "1",
          "secret" : "普通商密",
          "secretExpDate" : 1650384000000,
          "secretId" : "2",
          "secretPeriodId" : 1,
          "sectId" : "6480640146142464",
          "sectName" : "新奥集团档案局",
          "sectNo" : "A0022",
          "thridId" : "A0022-2020-0000000769",
          "writingDate" : 1650384000000,
          "year" : "2020"
        }
      }
    ]
  },
  "aggregations" : {
    "yearGroup" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "2020",
          "doc_count" : 6
        }
      ]
    },
    "archTypeGroup" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "6495573858862336#split#02 领导证照",
          "doc_count" : 3
        },
        {
          "key" : "6485924961527040#split#建设项目",
          "doc_count" : 1
        },
        {
          "key" : "6485930821313792#split#设备仪器",
          "doc_count" : 1
        },
        {
          "key" : "6489894262050048#split#01 企业证照",
          "doc_count" : 1
        }
      ]
    }
  }
}

java实现:

SearchRequest searchRequest = new SearchRequest(ermsesProperties.getIndex());
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();            
//第一个字段进行分组
TermsAggregationBuilder yearGroupAgg = AggregationBuilders.terms("yearGroup").field("year.keyword");
//第二个字段进行分组,使用script方式拼接返回值,但是要保证archTypeId和archTypeName是一对一的
Script script = new Script("doc['archTypeId.keyword'].value +'#split#'+ doc['archTypeName.keyword'].value");
TermsAggregationBuilder archTypeGroupAgg = AggregationBuilders.terms("archTypeGroup").script(script);
//添加aggregation
sourceBuilder.aggregation(yearGroupAgg);
sourceBuilder.aggregation(archTypeGroupAgg);
searchRequest.source(sourceBuilder);

刚接触es,不熟悉,最新版本的教程也不多。实际上基本是通过kibana敲命令琢磨出来的。建议装一个kibana或者head来辅助自己熟悉es。

四、分词的字段做聚合

这种情况,先看常规做法。这里以archTypeCode2和archTypeName做平级聚合,但是archTypeName字段是分词字段。往下看:

kibana:


POST ermsftrv1/_search
{
  "aggs": {
    "archTypeGroup": {
      "terms": {
        "field": "archTypeCode2",
        "size": 10
      }
    },
    "yearGroup": {
      "terms": {
        "field": "archTypeName",
        "size": 10
      }
    }
  }
}

聚合结果:

"aggregations" : {
    "yearGroup" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 4,
      "buckets" : [
        {
          "key" : "证照",
          "doc_count" : 20
        },
        {
          "key" : "01",
          "doc_count" : 10
        },
        {
          "key" : "企业",
          "doc_count" : 10
        },
        {
          "key" : "02",
          "doc_count" : 9
        },
        {
          "key" : "领导",
          "doc_count" : 9
        },
        {
          "key" : "仪器",
          "doc_count" : 3
        },
        {
          "key" : "类型",
          "doc_count" : 3
        },
        {
          "key" : "设备",
          "doc_count" : 3
        },
        {
          "key" : "声像",
          "doc_count" : 2
        },
        {
          "key" : "建设",
          "doc_count" : 2
        }
      ]
    },
    "archTypeGroup" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "ZZ",
          "doc_count" : 20
        },
        {
          "key" : "SB",
          "doc_count" : 3
        },
        {
          "key" : "JS",
          "doc_count" : 2
        },
        {
          "key" : "SX",
          "doc_count" : 2
        }
      ]
    }
  }

archTypeName这个聚合出现了:证照、01....等,这些是被分词后的。所以结果并不理想,我们这样解决。

在设置mapping时,archTypeName字段这么设置即可,

        "archTypeName" : {
          "type" : "text",
          "fields" : {
            "raw" : {
              "type" : "keyword" #如果不设置keyword索引在聚合时将会使用已分解后的词
            }
          },
          "analyzer" : "ik_max_word",
          "fielddata" : true
        }

这样正常使用archTypeName还是分词搜索即可,当我们需要使用archTypeName.keyword时只需要写archTypeName.raw.keyword即可,

修改后的kibana:

POST ermsftrv1/_search
{
  "aggs": {
    "archTypeGroup": {
      "terms": {
        "field": "archTypeCode2",
        "size": 10
      }
    },
    "yearGroup": {
      "terms": {
        "field": "archTypeName.raw",
        "size": 10
      }
    }
  }
}

聚合结果:01 企业证照、设备仪器等既可以当做完整的词来聚合展示了。

"aggregations" : {
    "yearGroup" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "01 企业证照",
          "doc_count" : 10
        },
        {
          "key" : "02 领导证照",
          "doc_count" : 9
        },
        {
          "key" : "设备仪器",
          "doc_count" : 3
        },
        {
          "key" : "声像类型",
          "doc_count" : 2
        },
        {
          "key" : "建设项目",
          "doc_count" : 2
        },
        {
          "key" : "证照类型",
          "doc_count" : 1
        }
      ]
    },
    "archTypeGroup" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "ZZ",
          "doc_count" : 20
        },
        {
          "key" : "SB",
          "doc_count" : 3
        },
        {
          "key" : "JS",
          "doc_count" : 2
        },
        {
          "key" : "SX",
          "doc_count" : 2
        }
      ]
    }
  }

五、实践代码

献上最终版代码,其中有大部搜索情况下的java实现方式,可以参考。

//全文检索字段列表
    private final String[] MULTI_MATCH_FILDS ={
                "archName","archNo","archTypeCode","archivedDept","archTypeName","archivedYear","createUser","notes",
                "reorganizeOper","responsibleOper","savePeriod","secret","sectName","sectNo","writingDate","writingYear",
                "year","signatory"
            };

    //全文检索高亮字段列表
    private final String[] MULTI_MATCH_HIGHLIGHT_FILDS ={
            "archName","archNo","archTypeCode","archivedDept","archTypeName","archivedYear","createUser","notes",
            "reorganizeOper","responsibleOper","savePeriod","secret","sectName","sectNo","writingDate","writingYear",
            "year","signatory"
    };

    /**
     * 全文mapping中会被分词,并且含有keyword的字段
     */
    private final List<String> MULTI_MATCH_KEYWORD_FIELDS = Arrays.asList(
            "archName", "archNo","archTypeCode","archTypeName","archivedDate","archivedDept",
            "archivedOperator","savePeriod","secretId","sectName", "sectNo","ermsProjectNo",
            "productNo",  "factoryNumber","volumeHao","ERMS_META_DATA_METADATA_EMPLOYEE_NO",
            "ermsProjectName","dossierName", "dossierArchivedDept","equipmentUse",  "ERMS_META_DATA_METADATA_ENTERPRISE_NAME",
            "ERMS_META_DATA_METADATA_FIRST_PARTY","ERMS_META_DATA_METADATA_SECOND_PARTY",
            "ERMS_META_DATA_METADATA_THIRD_PARTY","ERMS_META_DATA_METADATA_CONTRACT_OBJECT","signatory"
    );

    /**
     * bool查询的使用
     * Bool查询对应Lucene中的BooleanQuery,它由一个或者多个子句组成,每个子句都有特定的类型
     *
     * must
     * 返回的文档必须满足must子句的条件,并且参与计算分值
     *
     * filter
     * 返回的文档必须满足filter子句的条件,但是不会像must一样,参与计算分值
     *
     * should
     * 返回的文档可能满足should子句的条件.在一个bool查询中,如果没有must或者filter,有一个或者多个should子句,那么只要满足一个就可以返回.minimum_should_match参数定义了至少满足几个子句.
     *
     * must_not
     * 返回的文档必须不满足定义的条件
     *
     * 如果一个查询既有filter又有should,那么至少包含一个should子句.
     *
     * bool查询也支持禁用协同计分选项disable_coord.一般计算分值的因素取决于所有的查询条件.
     *
     * bool查询也是采用more_matches_is_better的机制,因此满足must和should子句的文档将会合并起来计算分值.
     *
     * @param request
     * @return
     */
    @Override
    public Map<String, Object> bindAdvancedQueryGrid(AdvancedQueryParam request) {
        log.info("context:{}", Context.getCurrentUser());
        log.info("查询参数::::{}",request);
        Map resMap = new HashMap();
        //必要参数校验
        if(!request.getAdvanced() && StringUtils.isBlank(request.getKey())&&
                StringUtils.isBlank(request.getQueryItem())){//不是高级搜索的时候需要穿key
            resMap.put("errMsg","关键字不能为空");
            resMap.put("errCode","-1");
            return resMap;
        }
        SearchRequest searchRequest = new SearchRequest(ermsesProperties.getIndex());
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

        // 高级搜索条件
        if (request.getAdvanced()) {//高级搜索参数拼接
            //添加范围
            List<Integer> range = request.getRange();
            if(ObjectUtils.isEmpty(range) || (!range.contains(3) && !range.contains(1)))return resMap;//没选范围返回空
            if(range.size()==1){//档案库和预归档只选了一个库的话
                if (range.contains(3)){//档案库
                    boolQueryBuilder.must(QueryBuilders.termQuery("archStatus",3));
                }else if(range.contains(1)){//我要归档
                    boolQueryBuilder.must(QueryBuilders.termQuery("archStatus",1));
                }
            }
            List<AdvancedCondition> advancedConditions = request.getAdvancedConditions();
            for (AdvancedCondition condition:advancedConditions) {
                //主要参数为空时跳过
                if(StringUtils.isBlank(condition.getValue()) ||
                        StringUtils.isBlank(condition.getBelong()) ||
                        (("9".equals(condition.getBelong()) || "10".equals(condition.getBelong()))
                                && StringUtils.isBlank(condition.getInput())))continue;
                //如果包含标题内容,添加搜索key以便查询电子文件
                if("archName".equals(condition.getValue()) && StringUtils.isBlank(request.getKey())){
                    request.setKey(condition.getInput());
                }
                //查询条件构建
                QueryBuilder termQueryBuilder;
                /**
                 * 条件关系
                 *   { id: 1, label: '包含', value: '1' },
                 *   { id: 2, label: '小于', value: '2' },
                 *   { id: 3, label: '小于等于', value: '3' },
                 *   { id: 4, label: '不等于', value: '4' },
                 *   { id: 5, label: '等于', value: '5' },
                 *   { id: 6, label: '大于', value: '6' },
                 *   { id: 7, label: '大于等于', value: '7' },
                 *   { id: 8, label: '不包含', value: '8' },
                 *   { id: 9, label: '为空', value: '9' },
                 *   { id: 10, label: '不为空', value: '10' },
                 *   { id: 11, label: '以之结尾', value: '11' },
                 *   { id: 12, label: '以之开头', value: '12' }
                 */
                switch (condition.getBelong()){
                    case "1":
                        termQueryBuilder = QueryBuilders.matchQuery(condition.getValue(), condition.getInput());
                        break;
                    case "2":
                        termQueryBuilder = QueryBuilders.rangeQuery(condition.getValue()).lt(condition.getInput());
                        break;
                    case "3":
                        termQueryBuilder = QueryBuilders.rangeQuery(condition.getValue()).lte(condition.getInput());
                        break;
                    case "4":
                        termQueryBuilder = boolQueryBuilder.mustNot(QueryBuilders.termQuery(condition.getValue(), condition.getInput()));
                        break;
                    case "5":
                        if(MULTI_MATCH_KEYWORD_FIELDS.contains(condition.getValue())){
                            termQueryBuilder = QueryBuilders.termQuery(condition.getValue()+".keyword", condition.getInput());
                        }else {
                            termQueryBuilder = QueryBuilders.termQuery(condition.getValue(), condition.getInput());
                        }
                        break;
                    case "6":
                        termQueryBuilder = QueryBuilders.rangeQuery(condition.getValue()).gt(condition.getInput());
                        break;
                    case "7":
                        termQueryBuilder = QueryBuilders.rangeQuery(condition.getValue()).gte(condition.getInput());
                        break;
                    case "8":
                        termQueryBuilder = boolQueryBuilder.mustNot(QueryBuilders.matchQuery(condition.getValue(), condition.getInput()));
                        break;
                    case "9":
                        termQueryBuilder = boolQueryBuilder.mustNot(QueryBuilders.existsQuery(condition.getValue()));
                        break;
                    case "10":
                        termQueryBuilder = QueryBuilders.existsQuery(condition.getValue());
                        break;
                    case "11"://? 匹配任意字符,* 匹配0个或多个字符
                        termQueryBuilder = QueryBuilders.wildcardQuery(condition.getValue(), "*"+condition.getInput());
                        break;
                    case "12":
                        termQueryBuilder = QueryBuilders.prefixQuery(condition.getValue(), condition.getInput());
                        break;
                    default:
                        continue;
                }
                if(StringUtils.isNotBlank(condition.getLogic()) && "2".equals(condition.getLogic())){//或
                    boolQueryBuilder.should(termQueryBuilder);
                }else {//与
                    boolQueryBuilder.must(termQueryBuilder);
                }
            }
        }else {
            //全文检索只搜档案库
            boolQueryBuilder.must(QueryBuilders.termQuery("archStatus",3));
            //全文检索--模糊查询条件
            boolQueryBuilder.must(QueryBuilders.multiMatchQuery(request.getKey(),MULTI_MATCH_FILDS));//取消全文检索,改为单属性选择搜索
        }

        //检索中--输入条件--档号
        if (!ObjectUtils.isEmpty(request.getArchNo())) {
            boolQueryBuilder.must(QueryBuilders.matchQuery("archNo", request.getArchNo()));
        }
        //检索中--输入条件--档案名称
        if (!ObjectUtils.isEmpty(request.getArchName())) {
            boolQueryBuilder.must(QueryBuilders.matchQuery("archName", request.getArchName()));
        }
        //检索中--输入条件--归档时间
        if (!ObjectUtils.isEmpty(request.getStartDate()) || !ObjectUtils.isEmpty(request.getEndDate())) {
            Object start = request.getStartDate();
            Object end = request.getEndDate();
            boolQueryBuilder.must(QueryBuilders.rangeQuery("archivedDate").from(start+" 00:00:00.000").to(end+" 59:59:59.999"));
        }

        //检索中--分类条件--门类
        if (!ObjectUtils.isEmpty(request.getArchTypeCode2())) {
            boolQueryBuilder.must(QueryBuilders.termsQuery("archTypeCode2", request.getArchTypeCode2()));
        }
        //检索中--分类条件--全宗查询条件,非全库且有全宗id时
        if (!ObjectUtils.isEmpty(request.getSectId())) {
            boolQueryBuilder.must(QueryBuilders.termQuery("sectId", request.getSectId()));
        }
        //检索中--分类条件--保管期限查询条件
        if (!ObjectUtils.isEmpty(request.getSavePeriodId())) {
            boolQueryBuilder.must(QueryBuilders.termQuery("savePeriodId", request.getSavePeriodId()));
        }
        //检索中--分类条件--成文日期查询条件
        if (!ObjectUtils.isEmpty(request.getWritingYear())) {
            boolQueryBuilder.must(QueryBuilders.termQuery("writingYear", request.getWritingYear()));
        }

        //2.5是否聚合 //TODO
        //加入聚合
        if (request.getAggregation()) {
            //成文年份聚合
            TermsAggregationBuilder yearGroupAgg = AggregationBuilders.terms("writingYearGroup").field("writingYear");
            sourceBuilder.aggregation(yearGroupAgg);
            //门类、档案类型聚合
            TermsAggregationBuilder archTypeCode2Agg = AggregationBuilders.terms("archTypeCode2Group").field("archTypeCode2");
            sourceBuilder.aggregation(archTypeCode2Agg);
            //全宗聚合
            Script script = new Script("doc['sectId'].value +'#split#'+ doc['sectName.keyword'].value");
            TermsAggregationBuilder archTypeGroupAgg = AggregationBuilders.terms("sectGroup").script(script);
            sourceBuilder.aggregation(archTypeGroupAgg);
            //保管期限聚合
            TermsAggregationBuilder savePeriodAgg = AggregationBuilders.terms("savePeriodGroup").field("savePeriodId");
            sourceBuilder.aggregation(savePeriodAgg);
        }
        // 设置分页
        sourceBuilder.query(boolQueryBuilder);
        Integer offSet = 0;
        Integer limit = 10;
        if (!ObjectUtils.isEmpty(request.getPage()) && !ObjectUtils.isEmpty(request.getSize())) {
            Integer page = (Integer) request.getPage();
            limit = (Integer) request.getSize();
            offSet = (page - 1) * limit;
        }
        sourceBuilder.from(offSet);
        sourceBuilder.size(limit);
        sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
        //TODO 设置高亮

        //添加检索条件
        searchRequest.source(sourceBuilder);

        //2.构建查询结果
        try {
            SearchResponse searchResponse = es.searchDocument(searchRequest);
            if(searchResponse.status() != RestStatus.OK){
                resMap.put("errMsg","查询数据失败");
                resMap.put("errCode","-1");
                return resMap;
            }
            SearchHits hits = searchResponse.getHits();
            //2.1构建返回总数
            Long count = hits.getTotalHits().value;
            //2.2构建返回内容
            ES_ARCHIVED_FORM_RESPONSE response = new ES_ARCHIVED_FORM_RESPONSE();
            List<ESArchObject> list = new ArrayList<>();

            //字段遮挡 -- 获取可见权限
            final List<ErmsDigitalRights> ermsDigitalRights = digitalRightsService.getErmsDigitalRights();
            Map<String, Set<String>> archTypeIdMap = ermsDigitalRights.stream()
                    .filter(r -> r.getErmsArchTypeId() != null)
                    .collect(Collectors.groupingBy(r -> String.valueOf(r.getErmsSectId()),
                            Collectors.mapping(r -> String.valueOf(r.getErmsArchTypeId()),
                                    Collectors.toSet())));

            for (SearchHit hit : hits.getHits()) {
                ESArchObject esArchObject = JSON.parseObject(hit.getSourceAsString(), ESArchObject.class);
                //字段遮挡 -- 替换遮挡属性
                hiddenField(archTypeIdMap.get(esArchObject.getSectId()), esArchObject);
                list.add(esArchObject);
            }
            response.setForms(list);

            if (request.getAggregation()) {//构建聚合
                Aggregations aggregations = searchResponse.getAggregations();
                //构建成文年份分组
                Terms yearGroup = aggregations.get("writingYearGroup");
                if(!CollectionUtils.isEmpty(yearGroup.getBuckets())){
                    List<Map> years = new ArrayList<>();
                    for (Terms.Bucket bucket : yearGroup.getBuckets()) {
                        Map<String,Object> iterm = new HashMap<>();
                        putGroupIterm(bucket, iterm, bucket.getKeyAsString(), bucket.getKeyAsString());
                        years.add(iterm);
                    }
                    response.setWritingYearGroup(years);
                }
                //构建档案类型分组
                Terms archTypeCode2Group = aggregations.get("archTypeCode2Group");
                if(!CollectionUtils.isEmpty(archTypeCode2Group.getBuckets())){
                    List<Map> archTypeCode2s = new ArrayList<>();
                    for (Terms.Bucket bucket : archTypeCode2Group.getBuckets()) {
                        Map<String,Object> iterm = new HashMap<>();
                        putGroupIterm(bucket, iterm, bucket.getKeyAsString(), bucket.getKeyAsString());
                        archTypeCode2s.add(iterm);
                    }
                    response.setArchTypeCode2Group(archTypeCode2s);
                }
                //构建全宗分组
                Terms sectGroup = aggregations.get("sectGroup");
                if(!CollectionUtils.isEmpty(sectGroup.getBuckets())){
                    List<Map> sects = new ArrayList<>();
                    for (Terms.Bucket bucket : sectGroup.getBuckets()) {
                        if(StringUtils.isNotBlank(bucket.getKeyAsString()) && bucket.getKeyAsString().contains("#split#")){
                            String[] split = bucket.getKeyAsString().split("#split#");
                            Map<String,Object> iterm = new HashMap<>();
                            putGroupIterm(bucket, iterm, split[0], split[1]);
                            sects.add(iterm);
                        }
                    }
                    response.setSectGroup(sects);
                }
                //构建保管期限分组
                Terms savePeriodGroup = aggregations.get("savePeriodGroup");
                if(!CollectionUtils.isEmpty(savePeriodGroup.getBuckets())){
                    List<Map> savePeriods = new ArrayList<>();
                    for (Terms.Bucket bucket : savePeriodGroup.getBuckets()) {
                        Map<String,Object> iterm = new HashMap<>();
                        putGroupIterm(bucket, iterm, bucket.getKeyAsString(), bucket.getKeyAsString());
                        savePeriods.add(iterm);
                    }
                    response.setSavePeriodGroup(savePeriods);
                }

                //获取电子文件聚合
                if (!request.getAdvanced() && StringUtils.isNotBlank(request.getKey())){
                    try {
                        ElectronicSearchParam param = new ElectronicSearchParam();
                        BeanUtils.copyProperties(param,request);
                        if(StringUtils.isNotBlank(param.getKey())){
                            response.setElectronicGroup(eleFacetSearchRest(param));//电子文件分类统计
                        }
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    } catch (InvocationTargetException e) {
                        e.printStackTrace();
                    }
                }

            }
            //TODO 查询的同时 往 检索历史表存入检索的
            /*if (!ObjectUtils.isEmpty(request.get("archName"))||!ObjectUtils.isEmpty(request.get("IDes"))||!ObjectUtils.isEmpty(request.get("archNo"))||!ObjectUtils.isEmpty(request.get("name"))|| !ObjectUtils.isEmpty(request.get("end"))||!ObjectUtils.isEmpty(request.get("start"))){
                ERMSSearchHistory ermsSearchHistory=new ERMSSearchHistory();
//            Context.getERMSSearchHistoryService().createSearchHistory(ermsSearchHistory,request,count);
            }*/



            //3.查询到的值封装并返回
            response.setCount(count);
            resMap.put("data", response);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return resMap;

    }

环境搭建可见:

docker swarm集群下部署elasticsearch7.6.2集群+kibana7.6.2+es-head+中文分词

linux Centos7 安裝搭建elasticsearch7.6.2+kibana7.6.2+中文分词7.6.2详解

gogogo!

ElasticSearch实现GroupBy多字段分组统计 Es多字段分组,最佳尝试 阅读详情

相关推荐

ES系列:ES使用script脚本方法(拼接字段举例)

目录 效果 代码 ES 7.0+测试 效果 代码 GET twitter/_search { "script_fields": { "my_script": { "script": { "lang": "painless", "source": "doc['country.keyword'].value +'_' + doc['city.keyword'].value + '_优快云_NIO4444' "

NIO4444 4293

springboot2+elasticsearch7+可视化es-head+cerebro整合搜索

【讲师介绍】      现某知名大型互联网公司资深架构师,技术总监,职业规划师,面试官,曾在某上市培训机构,高校任教多年。    Array老师 10多年互联网公司实战经验,知名的大型互联网公司的架构师,高管等职,在企业长期从事于技术的源码阅读和新技术的研究;从事面试官多年 。技术选型开发环境:Eclipse/Idea ,JDK 1.8及其以上 后端技术核心框架:SpringBoot2.x框架系列(同样适用Springcloud F版本以后的版本),如下(节选):    持久层框架:RestHighLevelClient(官方推荐)工具类:Apache Commons、Jackson 、fastjson、Gson有四种不同的方式来产生JSON格式的文档(document)手动方式,使用原生的byte[]或者String使用Map方式,会自动转换成与之等价的JSON使用第三方库来生成序列化beans,如JackJSON、FastJSON等使用内置的帮助类XContentFactory.jsonBuilder()前端技术  :ElasticSearch-head插件(NodeJs版本)课程内容:springboot2.1.8+Es7.3.2的完美结合,让大数据PB级别的数据查询,瞬间展示和释放生产力;Es7.x(elasticsearch7.x)目前最新官方版本的集群搭建 绚丽的可视化工具结合展示 中文分词器让你搜索无忧,一次搞定新技术 课程截图

卡尔曼滤波、互补滤波与Tsinghua滤波:平衡车姿态感知的三大算法对比

本文对比了平衡车姿态感知中的卡尔曼滤波、互补滤波与Tsinghua滤波三大核心算法。互补滤波计算简单,适合入门;卡尔曼滤波理论最优但实现复杂;Tsinghua滤波则是一种面向嵌入式优化的轻量级方案,通过动态权重调整和零偏估计,在资源受限的MCU上实现了性能与效率的平衡,是智能车竞赛等场景的实用选择。

weixin_29232121的博客 349

ElasticSearch7.x入门到案例实战教程

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。ElasticSearch应用场景维基百科,类似百度百科,全文检索,高亮,搜索推荐The Guardian(国外新闻网站),类似搜狐新闻,用户行为日志(点击,浏览,收藏,评论)+社交网络数据(对某某新闻的相关看法),数据分析,给到每篇新闻文章的作者,让他知道他的文章的公众反馈(好,坏,热门,垃圾,鄙视,崇拜)Stack Overflow(国外的程序异常讨论论坛),IT问题,程序的报错,提交上去,有人会跟你讨论和回答,全文检索,搜索相关问题和答案,程序报错了,就会将报错信息粘贴到里面去,搜索有没有对应的答案GitHub(开源代码管理),搜索上千亿行代码电商网站,检索商品通过理论和剖析原理的方式让你熟悉ElasticSearch技术,节省你的学习时间和提高你的学习效率。

别再为倍福EL6021/EL6022的RS485接线头疼了!手把手教你硬件跳线与软件配置(附Modbus RTU主站例程)

本文详细解析了倍福EL6021/EL6022模块的RS485硬件跳线与软件配置方法,包括Modbus RTU主站编程实战。从端子定义、跳线操作到TwinCAT 3环境设置,提供完整的通信例程和故障排查技巧,帮助工程师快速解决工业现场通信问题。

weixin_30634661的博客 591

用LTspice仿真Buck电路输出电容:从参数计算到波形优化的全流程演示

本文详细介绍了使用LTspice仿真Buck电路输出电容的全流程,从理论计算到波形优化。通过解析关键参数如纹波电压、瞬态响应和ESR,结合工程计算方法和LTspice仿真技巧,帮助工程师优化Buck电路设计,解决输出纹波过大和瞬态响应不佳的问题。

night的博客 851

Java使用RestHighLevelClient操作ElasticSearch,实现多字段Group by并将结果进行count排序

前言 之前写过一篇使用RestHighLevelClient进行多字段group by的(【原创】ElasticSearch使用Java代码group by多个字段查询统计数量_DCTANT的博客-优快云博客_elasticsearch分组统计 java),其实那篇并不完美,最佳的group by方法应该用script,而不是像之前那篇博客一样去递归求和,虽然也不是不行,但是这个毕竟太暴力了,效率也不高。直接上代码: 初始化RestHighLevelClient我这边为了节省篇幅先跳过了,直接上核心:Se

u011250186的博客 3199

从原理到代码:拆解UniFormer中动态位置嵌入(DPE)的3D卷积实现

本文深入解析了UniFormer模型中动态位置嵌入(DPE)模块的3D卷积实现原理与代码。DPE通过一个轻量的3D深度可分离卷积,替代传统静态位置编码,使模型能自动学习视频数据的时空位置关系。文章对比了其与Swin Transformer相对位置偏置的优劣,并提供了PyTorch实现代码与高级定制方案,为视频理解任务提供了高效灵活的动态位置编码解决方案。

weixin_29207149的博客 309

ElasticSearch之script语法使用

script参数能够自由定义需要比较运算的字段

勤于笔记,成于点滴。 5147

PCB布局布线要求及多层电路板叠加原则

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考本文主要针对PCB布局布线中的要点进行了总结,并对多层电路板的叠加原则进行了解释。

Ka_wyb的博客 2934

OpenOCD入门到精通:第20章 Target 子系统源码分析

摘要:本章深入分析OpenOCD Target子系统的核心实现机制。重点包括:1) 通过target_type虚函数表实现多架构抽象,支持ARM、RISC-V等30+种目标;2) ARM ADIv5协议栈实现,包含DAP/AP核心数据结构和访问机制;3) 分层架构设计,从调试接口层到传输层的完整调用链路。系统采用面向对象思想,统一管理目标状态、寄存器缓存、断点/观察点等调试要素,为上层提供标准化的调试操作接口。

从事嵌入式linux android驱动开发,拥有全栈能力 178

Elasticsearch 聚合检索 (分组统计)

"size": 0,"aggs": {"terms": {"order": { "avg_price": "desc" } // 根据下述统计的结果排序},"aggs": {与#2.1节内容相似, 区别在于按照价格排序显示了.

cxs812760493的博客 5093

【20260309】【亲测可用】【异常】Get https://registry-1.docker.io/v2/: net/http: request canceled

【异常】Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection。

奶爸的编程之路,也就一周冷个三天 2万+

SpringBoot 整合 ES 进行各种高级查询搜索

elasticsearch中的内部对象无法按预期工作,这里的问题是elasticsearch(lucene)使用的库没有内部对象的概念,因此内部对象被扁平化为一个简单的字段名称和值列表。值得我们注意的是在进行聚合操作的fild上,如果我们该字段设置成key或者text,则会出现以下错误。本章git上的代码如果有被注释掉的,只是为了防止和后面的章节不冲突,并无错误,大家自行解注查看即可。因为本文都是数据的搜索,所以我们需要在我们的es服务器里先插入一些数据以供我们后面使用。有时候,我们需要查询一个。

zhiyikeji的博客 4119

电动汽车远程监控与诊断软件:BMW ConnectedDrive EV远程监控二次开发_7.数据安全与隐私保护

数据加密是保护数据安全的重要手段之一。在电动汽车远程监控与诊断软件中,加密技术可以确保数据在传输过程中的安全性和完整性。常见的加密技术包括对称加密和非对称加密。

zhubeibei168的博客 884

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

ElasticSearch+SpringBoot聚合、分组、排序、分页、10000条查询限制及遇到的问题

一、SQL转换 Select From Where and or not Group by Having Order by 1、单条件查询 Select from book where name = “小明” 精确匹配 QueryBuilders.matchQuery("name",”小明”); 模糊查询 //1.常用的字符串查询 Select from book where name like “%小%” QueryBuilders.queryStringQuery("fieldValue"

qq_40749830的博客 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

elasticsearch使用script进行聚合,统计数组类型字段

最近在使用elasticsearch进行聚合时遇到一个问题,有一个字段是数组类型,该字段存储的是客户订阅的产品id,要聚合统计每个客户订阅了几个产品,比如统计订阅了2到3个的。 这个时候就要知道每个客户该字段数组的长度,但是elasticsearch聚合文档里没有相关操作,查阅资料后发现要用script来处理。 DSL语句如下: GET customer/_search { "query": { "bool": { "filter": [ { "

m0_54850467的博客 2645

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

SQL REST API - 总览

SQL REST API接受JSON文档中的SQL,执行该SQL,然后返回结果。 例如: POST /_sql?format=txt { "query": "SELECT * FROM library ORDER BY page_count DESC LIMIT 5" } 返回结果: author name page_count release_date Peter F. Hamilton Pandora’s Star 768 2004-03-02T00:00:00.000Z Ve

随风飘雁 925

elasticsearch script实战

写在前面 大家在开发elasticsearch的时候都会遇到很多去怪的需求,如果我们已知的RestAPI无法帮助我们完成搜索,是就需要我们自己动手写脚本来辅助搜索,完成需求. 浅谈elasticsearch-script脚本使用机制 通过阅读官方文档我们可以了解到es所使用的脚本语言是painless这是一门安全-高效的脚本语言,基于jvm的,总而言之对于java语言的小伙伴来说是非常友好的. ...

qq_19663899的博客 1万+

ElasticSearch分组统计查询

ElasticSearch分组统计查询,使用ElasticsearchRestTemplate

weixin_42456784的博客 1924

java Elasticsearch QueryBuilders 用法

java Elasticsearch QueryBuilders 用法 ,等于,不等于,大于,小于,in,like,排序

weixin_42277397的博客 6789

springboot~elasticsearch对nested集合类型的字段进行不等于的检索

对于es的数据类型来说,如果它是一个复杂类型,而我们需要把复杂类型进行检索,那么应该定义成nested类型,而对于它的检索,如果是非集合数据,它与其它类型没有分别;而如果你的nested存储的数据是一个集合,那在进行不等于这种操作时,就需要说明一下了。

band_mmbx的博客 1261

Java调用ElasticSearch 7.2.1 保存、统计、多字段分组聚合

目录 maven引用 配置 配置类 保存数据方法 参照官方的引用方式会报错 分组统计 查询后再统计 多字段分组聚合 maven引用 注意版本与es版本一致 <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>e...

草宝虫的博客 9488

elasticsearch 聚合操作分组查询 并列分组在通过其他字段求sum 排序 并列分组效果类似于 Mysql中的(Select A,B from 表名 group by A,B)

需求 有三个字段 需要把A字段和B字段结合起来 共同分组 用Mysql 写的话 就相当一是 Select A,B from 表名 group by A,B 但是在elasticsearch 的查询中分组都是 : Aggregation(中文意思:聚合)关键字进行聚合分组,然后是最关键的,多个group by不能使用并列Aggregation,必须使用嵌套聚合,采用subAggregation进行嵌套!! TermsAggregationBuilder agg_top_elapsed_time_by_appl

m0_46937429的博客 4757

ElasticSearch多字段分组聚合VS mysql group by a,b

ElasticSearch多字段分组聚合

u011250186的博客 781

Elasticsearch java api 常用查询方法QueryBuilder构造举例

Elasticsearch java api 常用查询方法QueryBuilder构造举例 环境 Elasticsearch版本 5....

别抢我蓝buff 1773
上一篇: linux Centos7 安裝搭建elasticsearch7.6.2+kibana7.6.2+中文分词7.6.2详解
下一篇: Redis可视化管理工具推荐
grootblockchain
博客等级 码龄11年 55粉丝 101原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值