当前位置:   article > 正文

es查询单字段去重_es去重查询

es去重查询

1 环境

es 7.10

2 去重方式

2.1 使用collapse功能

注意:使用此方式去重时,不会去除掉不存在去重字段的数据。
去重字段只能是数字类型或keyword

对text字段进行去重将报错,报错如下。

"unknown type for collapse field `xxx`,only keywords and numbers are accepted"

去重举例如下:
(1)根据approval查询,且根据standardId去重

  1. GET test/_search
  2. {
  3. "query": {
  4. "term": {
  5. "approval":"苏械注准20172091712"
  6. }
  7. },
  8. "collapse": {
  9. "field": "standardId"
  10. }
  11. }
  12. 其中standardId的mappings信息如下:
  13. "standardId" : {
  14. "type" : "long"
  15. }

(2)根据approval查询,且根据dosageName去重

  1. GET test/_search
  2. {
  3. "query": {
  4. "term": {
  5. "approval":"苏械注准20172091712"
  6. }
  7. },
  8. "collapse": {
  9. "field": "dosageName.keyword"
  10. }
  11. }
  12. 其中dosageName的mappings信息如下:
  13. "dosageName" : {
  14. "type" : "text",
  15. "fields" : {
  16. "keyword" : {
  17. "type" : "keyword",
  18. "ignore_above" : 256
  19. }
  20. }
  21. }

2.2 去重字段聚合+top_hits聚合

注意:使用此方式去重时,会去除掉不存在去重字段的数据。

根据approval查询,且根据standardId去重

  1. GET test/_search
  2. {
  3. "query": {
  4. "term": {
  5. "approval": "苏械注准20172091712"
  6. }
  7. },
  8. "size": 0,
  9. "aggs": {
  10. "age_aggs": {
  11. "terms": {
  12. "field": "standardId",
  13. "size": 10
  14. },
  15. "aggs": {
  16. "age_top": {
  17. "top_hits": {
  18. "sort": [{
  19. "standardId": {
  20. "order": "desc"
  21. }
  22. }],
  23. "size": 1
  24. }
  25. }
  26. }
  27. }
  28. }
  29. }

3 统计去重后的数量

3.1 聚合+cardinality

注意:使用此方式统计去重后的数量时,会去除掉不存在去重字段的数据。

查询根据approval查询,且根据standardId去重后的数量:

  1. # "size": 0 -> 指定es结果中不返回去重前的具体数据,只返回去重后的数量
  2. GET test/_search
  3. {
  4. "query": {
  5. "term": {
  6. "approval": "苏械注准20172091712"
  7. }
  8. },
  9. "size": 0,
  10. "aggs": {
  11. "age_aggs": {
  12. "cardinality": {
  13. "field": "standardId"
  14. }
  15. }
  16. }
  17. }

4 Java代码实现

4.1 使用collapse功能

使用collapse功能去重的关键在于使用CollapseBuilder设置去重字段。举例如下所示。

根据approval查询,且根据standardId去重:

  1. // 构建查询条件
  2. SearchSourceBuilder builder = new SearchSourceBuilder();
  3. BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
  4. boolQuery.must(QueryBuilders.termQuery("approval", "国药准字20240119001"));
  5. builder.query(boolQuery).from(0).size(20);
  6. CollapseBuilder collapseBuilder = new CollapseBuilder("standardId");
  7. builder.collapse(collapseBuilder);

5 参考文献

(1)ElasticSearch单字段查询去重详解
(2)es检索到的大量数据如何根据特定字段去重

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号