您的位置:

Es去重查询详解

一、Es去重查询分页

Es查询结果可能会包含重复的数据,要实现去重查询并进行分页显示,需要结合Es中的聚合函数和分页参数。首先使用terms aggregation对需要去重的字段进行聚合,然后再使用from和size参数对结果进行分页。


GET /index/_search
{
  "size": 10,
  "from": 0,
  "query": {...},
  "aggs":{
    "distinct_field":{
      "terms":{
        "field": "field_to_be_distinct"
      }
    }
  }
}

二、Es单个字段去重查询

如果只需要对单个字段进行去重查询,可以使用cardinality aggregation函数。该函数不仅可以进行去重操作,还可以返回去重后的结果数量。


GET /index/_search
{
  "query": {...},
  "aggs": {
    "distinct_field_count": {
      "cardinality": {
        "field": "field_to_be_distinct"
      }
    }
  }
}

三、Es查询语法

Es查询常用的查询语法有两种:Query DSL和Query String。Query DSL是Es原生的查询语法,Query String则是基于Lucene Query语法的更加简洁易用的查询方式。

Query DSL的语法结构较为复杂,但可以实现更加灵活的查询操作,例如使用bool查询组合多个查询条件。

Query String则是基于字符串的查询语法,使用语法简单,类似于SQL的写法。例如:


GET /index/_search?q=field_name:value

四、Es SQL查询

Es支持SQL语法进行查询,通过在Kibana中输入SQL语句或者将SQL语句通过REST API传递给Es集群来执行SQL查询。

ES SQL的查询方式与传统关系型数据库相似。可以使用SELECT、GROUP BY、ORDER BY等关键字,支持多表查询、连接查询等操作。


POST /_sql?format=txt
{
  "query": "SELECT * FROM index WHERE field_name = 'value' GROUP BY field_id ORDER BY field_date DESC LIMIT 10"
}

五、Es查询数据去重

Es中的聚合函数可以实现对数据进行去重操作,包括根据字段值去重、字符串长度去重等。不同的聚合函数可以实现不同的去重方式。

例如使用terms aggregation进行字段值去重:


GET /index/_search
{
  "size": 0,
  "aggs": {
    "distinct_field_values": {
      "terms": {
        "field": "field_name"
      }
    }
  }
}

六、Es查询索引

在Es中,为了加快查询速度,可以对需要查询的字段创建索引。创建索引可以使用mapping或者template进行操作,常见的索引类型包括text、keyword、date、numeric等。

例如创建text类型的索引:


PUT /index
{
  "mappings": {
    "properties": {
      "field_name": {
        "type": "text"
      }
    }
  }
}

七、Es查询去重复

Es中需要去重的时候,可以使用在查询中添加"collapse"属性的方式,即可以同时实现排序和去重。


GET /index/_search
{
  "query": {...},
  "collapse": {
    "field": "field_name"
  },
  "sort": [{
    "field_date": "desc"
  }]
}

八、Es关联查询

在Es中,可以使用Nested类型嵌套关系来实现关联查询。Nested类型允许在一个文档中嵌套其他文档,以实现多层级的查询。

例如创建Nested类型字段:


PUT /index
{
  "mappings": {
    "properties": {
      "field_name": {
        "type": "nested",
        "properties": {
          "subfield": {
            "type": "text"
          }
        }
      }
    }
  }
}

九、Es为什么查询速度快

Es查询速度之所以快,主要有以下几个原因:

  1. 倒排索引:Es使用倒排索引存储数据,可以快速查找满足条件的文档。
  2. 分片和复制:Es将索引分成多个分片进行存储和查询,每个分片可以独立的进行查询,大大提高查询效率。同时,Es也支持对分片进行复制,保证高可用性和数据备份。
  3. 缓存机制:Es内置了缓存机制,可以缓存查询结果和聚合结果,提高查询效率。
  4. 分布式架构:Es采用分布式架构,可以将数据分散存储在多个节点上,使得查询可以在多个节点中并行处理,提高查询效率。

十、Ems快递查询

Ems快递查询是一种基于Ems快递单号的物流查询服务。与Es的去重查询没有直接关系,但都是常用的数据查询方式。

例如使用Ems快递单号进行查询:


POST https://api-new.oee.dasouche-inc.net/order-delivery/dif-interface/query/es-ems
{
  "emsCodes": [
    "ems_code1",
    "ems_code2",
    ...
  ]
}