当前位置: 首页 > 面试题库 >

在Elasticsearch上查询每种类型的最新文档

景理
2023-03-14
问题内容

我正在尝试在Elasticsearch上运行看起来像一个简单查询的内容,但似乎无法获得想要的结果。

这是我要做的简短示例

我有一个新闻数据库。每条新闻都包含一个来源,一个标题,一个时间戳和一个用户。

我想要获得给定用户的每个可用来源的最新标题(基于时间戳)。

#!/bin/bash

export ELASTICSEARCH_ENDPOINT="http://localhost:9200"

# Create indexes

curl -XPUT "$ELASTICSEARCH_ENDPOINT/news" -d '{
    "mappings": {
        "news": {
            "properties": {
                "source": { "type": "string", "index": "not_analyzed" },
                "headline": { "type": "object" },
                "timestamp": { "type": "date", "format": "date_hour_minute_second_millis" },
                "user": { "type": "string", "index": "not_analyzed" }
            }
        }
    }
}'

# Index documents
curl -XPOST "$ELASTICSEARCH_ENDPOINT/_bulk?refresh=true" -d '
{"index":{"_index":"news","_type":"news"}}
{"user": "John", "source": "CNN", "headline": "Great news", "timestamp": "2015-07-28T00:07:29.000"}
{"index":{"_index":"news","_type":"news"}}
{"user": "John", "source": "CNN", "headline": "More great news", "timestamp": "2015-07-28T00:08:23.000"}
{"index":{"_index":"news","_type":"news"}}
{"user": "John", "source": "ESPN", "headline": "Sports news", "timestamp": "2015-07-28T00:09:32.000"}
{"index":{"_index":"news","_type":"news"}}
{"user": "John", "source": "ESPN", "headline": "More sports news", "timestamp": "2015-07-28T00:10:35.000"}
{"index":{"_index":"news","_type":"news"}}
{"user": "Mary", "source": "Yahoo", "headline": "More news", "timestamp": "2015-07-28T00:11:54.000"}
{"index":{"_index":"news","_type":"news"}}
{"user": "Mary", "source": "Yahoo", "headline": "Crazy news", "timestamp": "2015-07-28T00:12:31.000"}
'

那么,例如,如何从约翰那里获得最后的CNN和最后的ESPN头条新闻?

我一直在研究多重搜索API,但这意味着我需要事先了解所有资源(在本例中为CNN和ESPN)。


问题答案:

首先,请注意,我必须将您对该headline字段的映射更改为string,因为在示例文档中,标题为,string而不是object

因此,类似以下查询的查询将检索您期望的结果:

curl -XPOST "$ELASTICSEARCH_ENDPOINT/news/_search" -d '{
  "size": 0,
  "query": {
    "filtered": {
      "filter": {
        "term": {
          "user": "John"           <--- filter for user=John
        }
      }
    }
  },
  "aggs": {
    "sources": {
      "terms": {
        "field": "source"          <--- aggregate by source
      },
      "aggs": {
        "latest": {
          "top_hits": {
            "size": 1,             <--- only take the first...
            "_source": [           <--- only the date and headline
               "headline",
               "timestamp"
            ],
            "sort": {
              "timestamp": "desc"  <--- ...and only the latest hit
            }
          }
        }
      }
    }
  }
}'

这将产生如下内容:

{
  ...
  "aggregations" : {
    "sources" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [ {
        "key" : "CNN",
        "doc_count" : 2,
        "latest" : {
          "hits" : {
            "total" : 2,
            "max_score" : null,
            "hits" : [ {
              "_index" : "news",
              "_type" : "news",
              "_id" : "AU7Sh3VDGDddn2ZNuDVl",
              "_score" : null,
              "_source":{
                  "headline": "More great news", 
                  "timestamp": "2015-07-28T00:08:23.000"
              },
              "sort" : [ 1438042103000 ]
            } ]
          }
        }
      }, {
        "key" : "ESPN",
        "doc_count" : 2,
        "latest" : {
          "hits" : {
            "total" : 2,
            "max_score" : null,
            "hits" : [ {
              "_index" : "news",
              "_type" : "news",
              "_id" : "AU7Sh3VDGDddn2ZNuDVn",
              "_score" : null,
              "_source":{
                   "headline": "More sports news", 
                   "timestamp": "2015-07-28T00:10:35.000"
              },
              "sort" : [ 1438042235000 ]
            } ]
          }
        }
      } ]
    }
  }
}


 类似资料:
  • 问题内容: 目标 在数据库中选择每种产品的最低/最高价格。 问题 我只能获得具有指定标识符的产品。 我有的 我正在使用 MySQL, 并且有以下查询: 我的回报是,和。 解决方案 谢谢您的帮助。上面的两个答案都是正确的-但我选择@GordonLinoff答案被接受,因为我认为这将对初学者更加有用和享受-‘’但真的要感谢你们两个人。 最终查询: 干杯! 问题答案: 首先,使用时,即使MySQL不需要

  • 问题内容: 我有一些在Elasticsearch上建立索引的文档,看起来像这些样本: 我想建立一个查询,每个国家/地区只能得到一个结果,而只能得到。 因此,对于上面显示的示例,结果将类似于: 我意识到我需要进行汇总,但是我无法理解如何限制的结果。 有任何想法吗? 问题答案: 您可以使用将字段分组的聚合,每组返回1个文档,并按收集日期降序排列文档:

  • 问题内容: 一个has_many 。我想检索每天的最新帖子(使用),而忽略其他可能早些写的帖子。提出此问题的另一种方法可能是按部门要求每个最高薪水收入的雇员- 我认为也是一样。 如何在Rails(最好是4.0)中编写此查询?我认为这与它有关,但我似乎无法理解。有没有办法不用SQL来做到这一点? 为了明确起见,我想返回的是一系列post对象,它们是在各自日期上最后写入的对象。 谢谢! 问题答案: 它

  • 问题内容: 我需要一些帮助来编写/优化查询,以按类型检索每行的最新版本,并根据类型执行一些计算。我认为最好举个例子说明一下。 给定以下数据集: 预期结果应为: 帖子的末尾是用于获取此结果的查询。我愿意打赌,应该有一种优化它的方法,因为它使用的是带有联接的子查询,从我所了解的BigQuery来看,最好避免联接。但是首先要有一些背景: 从本质上讲,数据集表示一个只附加表,在该表中写入了multipe事

  • 我知道我可以通过http://localhost:9200/[index_name]/[index_type]/[_id]更新特定的文档,但是我的文档中的_id有#个符号,Sense找不到它们。 了解查询DSL将能够执行一个搜索,我能够指出_id不在URL中。资源:https://www.elastic.co/guide/en/elasticsearch/reference/current/que

  • 问题内容: 我正在尝试并且未能将我相对简单的SQL语句转换为可在Doctrine中使用的语句。 这是SQL语句,当对我的数据库运行时,它可以按要求工作: 到目前为止,这是DQL尝试: 当前哪个出现此错误: 表格本身非常简单:ID,名称,分数,平台,日期 有多个名称相同但得分不同的条目。我只想显示每个名称的“高分”。我已经尝试了一两天了,没有运气。谁能指出我正确的方向? 问题答案: 您尝试使用主义进