当前位置: 首页 > 知识库问答 >
问题:

ElasticSearch获取最后n条不同记录

拓拔富
2023-03-14

我正在尝试对存储在elasticsearch中的记录实现搜索查询。记录结构看起来像这样。

   {
    "_index" : "box_info_store",
    "_type" : "boxes",
    "_id" : "pWjQLWkBIJk0ORjd0X2P",
    "_score" : null,    
    "_source" : {
      "transactionID" : "60ab66cf24c9924f562bf1a2b5d92305d0a6",
      "boxNumber" : "Box3",
      "createDate" : "2013-09-17T00:00:00",
      "itemNumber" : "Item1",
      "address" : "Sample Address"
    }
  }

一个框可以包含多个项目。例如,Box3可以有Item1、Item2和Item3。因此,在elasticsearch中,我将有3个不同的文档。同时,同一个框和同一个项目也可以存在,但地址不同。这些文档的transactionID可能相同,也可能不相同。

我的要求是获取最后n个最近的和不同的TransactionID,以及它们的记录。

我尝试以下查询来获取最后7个不同的transactionID

GET /box_info_store/boxes/_search?size=7
{
  "query": {
    "bool": {
       "must": [
         {"match":{"boxNumber":"Box3"}},
         {"match":{"itemNumber":"Item1"}}
         ]
    }
  },
  "sort": [
    {
      "createDate": {
        "order": "desc"
      }
    }
  ],
  "aggs": {
    "distinct_transactions": {
      "terms": { "field": "transactionID"}
    }
  }
}

这让我找到了最后7个文档,其中boxNumber是Box3,itemNumber是Item1,但不是7个不同的transactionID,这7个文档中有两个具有相同的transactionID(但都有单独的地址)。但我的要求是获得7个不同的TransactionID,无论它返回多少个文档。

希望我能解释我自己。感谢您的帮助

谢啦

------编辑@gaurav9620,我运行第一个查询,得到的计数为32,然后我运行第二个查询,不同的计数为3,得到以下结果

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 32,
    "max_score" : null,
    "hits" : [
      {
        "_index" : "box_info_store",
        "_type" : "boxes",
        "_id" : "RWjRLWkBIJk0ORjdEX-L",
        "_score" : null,
        "_source" : {
          "transactionID" : "3087e106244f6247a5290fb21ce64254529c",
          "boxNumber" : "Box3",
          "createDate" : "2017-11-15T00:00:00",
          "itemNumber" : "Item1",
          "address" : "sampleAddress12",
        },
        "sort" : [
          1510704000000
        ]
      },
      {
        "_index" : "box_info_store",
        "_type" : "boxes",
        "_id" : "MGjQLWkBIJk0ORjdwX0M",
        "_score" : null,
        "_source" : {
          "transactionID" : "60ab66cf24c9924f562bf1a2b5d92305d0a6",
          "boxNumber" : "Box3",
          "createDate" : "2016-04-03T00:00:00",
          "itemNumber" : "Item1",
          "address" : "sampleAddress321",
        },
        "sort" : [
          1459641600000
        ]
      },
      ..........
      ..........
      ..........
      {
        "_index" : "box_info_store",
        "_type" : "boxes",
        "_id" : "AGjRLWkBIJk0ORjdK4CJ",
        "_score" : null,
        "_source" : {
          "transactionID" : "3087e106244f6247a5290fb21ce64254529c",
          "boxNumber" : "Box3",
          "createDate" : "1996-02-16T00:00:00",
          "itemNumber" : "Item1",
          "address" : "sampleAddress4324",
        },
        "sort" : [
          824428800000
        ]
      }
    ]
  },
  "aggregations" : {
    "unique_transactions" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 16,
      "buckets" : [
        {
          "key" : "3087e106244f6247a5290fb21ce64254529c",
          "doc_count" : 6
        },
        {
          "key" : "27c5f3422f4482495d29e7b2c15c0e311743",
          "doc_count" : 5
        },
        {
          "key" : "c40e53212e74e24bf02a5bd2b134cf92bffb",
          "doc_count" : 5
        }
      ]
    }
  }
}

共有1个答案

吉鸿宝
2023-03-14

您使用的大小:表示检索到的原始文档的数量。

如果您的案例需要做的是:

>

GET /box_info_store/boxes/_search? size=7{"查询":{"bool":{"必须": [ { "匹配":{"boxNumber":"Box3" } }, { "匹配":{"itemNumber":"Item1" } } ] } }, "排序": [ { "createDate":{"order":"desc" } } ], "aggs":{"distinct_transactions":{"条款":{"field":"transactionID","size": 7 } } } }

编辑-------------------------------------

首先触发此查询

GET /box_info_store/boxes/_search?size=0
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "boxNumber": "Box3"
          }
        },
        {
          "match": {
            "itemNumber": "Item1"
          }
        }
      ]
    }
  }
}

在这里,您将找到与您的查询匹配的文档总数,您可以将其设置为n在此触发您的查询后,如下所示

GET /box_info_store/boxes/_search?size=**n**
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "boxNumber": "Box3"
          }
        },
        {
          "match": {
            "itemNumber": "Item1"
          }
        }
      ]
    }
  },
  "sort": [
    {
      "createDate": {
        "order": "desc"
      }
    }
  ],
  "aggs": {
    "distinct_transactions": {
      "terms": {
        "field": "transactionID",
        "size": NUMBER_OF_UNIQUE_TRANSACTION_IDS_TO_BE_FETCHED
      }
    }
  }
}
 类似资料:
  • 问题内容: 我有一个包含以下列的数据库表: 在此表中,唯一的唯一值位于id中,即主键。 我想基于datetime值检索该表中的最后一组不同的记录。例如,下面是我的桌子 我想检索ID为4、7、8和9的记录,即具有不同代码(基于datetime值)的最后一组记录。我强调的只是我要实现的目标的一个示例,因为此表最终将包含数百万条记录和数百个单独的代码值。 我可以使用什么SQL语句来实现这一目标?我似乎无

  • 问题内容: 我正在使用mysql并遇到一些问题。我想检索插入的最后一行。 <<以下是详细>> 以下是我创建表格的方式。 我在其中插入了四个值,如下所示 当我执行时,我得到如下输出 当我尝试下面的代码时, 我得到如下输出。 但是,当我使用代码时,出现错误 使用时,表中没有任何数据。 链接以播放数据 注意: 这里我使用4只是为了获得所需的输出。稍后我可以从查询中获取 如果我只想查看最后一条记录,请建议

  • 问题内容: 我想做一个查询,从中选择一堆数据,但是我希望能够通过仅选择每三个记录,甚至每个百分之一的记录来降低数据的分辨率。任何。 有什么简单的方法可以用ActiveRecord做到这一点吗? 问题答案: 在Oracle中,我将其编写如下: 这样做的好处是,过滤器发生在数据库中,因此不会检索所有内容。 在PostgreSQL中,这称为(实际上是SQL标准)。在MySQL中,不支持此功能。 在mys

  • 问题内容: 注意:我看过 其他问题,并尝试过从中得出的答案,但是没有运气。 我在MongoDB中有一个集合: 我需要找到等于 10的 最后10个条目。听起来简单吗? 但是运行该命令可以得到 前 10条记录,而不是最后10条记录。看起来驱动程序的优先级为“ limit”而不是“ sorting” …我也尝试并进行排序。每当我从命令行运行相同的查询时,我都会得到所需的信息。这是我在命令行中键入的内容:

  • 问题内容: 这个问题已经在这里有了答案 : 8年前关闭。 可能重复: SQL Server:只有GROUP BY中的最后一个条目 我有一个这样的表: 我使用以下查询: 以上查询的结果: 在结果组上方按名称排列行,但显示每个组的第一行。我想从每个组中选择最后一行(按ID)。 例如: 如何编写以上结果的查询。 谢谢 问题答案: 甚至可能不再需要该组。

  • 本文向大家介绍MySQL获取所有分类的前N条记录,包括了MySQL获取所有分类的前N条记录的使用技巧和注意事项,需要的朋友参考一下 比如有文章表 Article(Id,Category,InsertDate),现在要用SQL找出每种类型中时间最新的前N个数据组成的集合,一段不错的代码,留存备用 @N 就是你要取多少条 下面是我用到了一个产品分类表中,superId是大分类,prcid是产品分类。能