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

ElasticSearch-返回唯一值

郭意
2023-03-14

如何从记录中获取所有语言的值并使它们唯一。

记录

PUT items/1
{ "language" : 10 }

PUT items/2
{ "language" : 11 }

PUT items/3
{ "language" : 10 }

查询

GET items/_search
{ ... }

# => Expected Response
[10, 11]

任何帮助都会很好。

共有3个答案

谷梁云瀚
2023-03-14

如果您想获取每个语言字段唯一值的第一个文档,您可以这样做:

{
 "query": {
    "match_all": {
    }
  },
  "collapse": {
    "field": "language.keyword",
    "inner_hits": {
    "name": "latest",
      "size": 1
    }
  }
}
卢德惠
2023-03-14

我也在为自己寻找这种解决方案。我在术语聚合中找到了引用。

因此,根据下面的说明,是正确的解决方案。

{
"aggs" : {
    "langs" : {
        "terms" : { "field" : "language",  
                    "size" : 500 }
    }
}}

但如果您遇到以下错误:

"error": {
        "root_cause": [
            {
                "type": "illegal_argument_exception",
                "reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [fastest_method] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead."
            }
        ]}

在这种情况下,您必须在请求中添加“关键字”,如下所示:

   {
    "aggs" : {
        "langs" : {
            "terms" : { "field" : "language.keyword",  
                        "size" : 500 }
        }
    }}
吴宝
2023-03-14

您可以使用术语聚合。

{
"size": 0,
"aggs" : {
    "langs" : {
        "terms" : { "field" : "language",  "size" : 500 }
    }
}}

聚合中的size参数指定聚合结果中包含的最大项数。如果需要所有结果,请将此值设置为大于数据中唯一项的数量。

搜索将返回类似以下内容:

{
"took" : 16,
"timed_out" : false,
"_shards" : {
  "total" : 2,
  "successful" : 2,
  "failed" : 0
},
"hits" : {
"total" : 1000000,
"max_score" : 0.0,
"hits" : [ ]
},
"aggregations" : {
  "langs" : {
    "buckets" : [ {
      "key" : "10",
      "doc_count" : 244812
    }, {
      "key" : "11",
      "doc_count" : 136794
 
    }, {
      "key" : "12",
      "doc_count" : 32312
       } ]
    }
  }
}
 类似资料:
  • 问题内容: 我将如何从记录中获取所有值,并使它们唯一。 记录 询问 任何帮助都会很棒。 问题答案: 您可以使用术语聚合。 搜索将返回如下内容: 聚合中的参数指定要包含在聚合结果中的最大术语数。如果需要所有结果,请将其设置为大于数据中唯一术语数的值。

  • 问题内容: 我遇到了一个问题,elasticsearch仅通过在嵌套字段上使用术语聚合就无法返回唯一文档的数量。 这是我们的模型的一个例子: 我想在状态字段上进行汇总,但是由于“ ny”在文档中出现两次,因此该文档将在“ ny”存储桶中计数两次。 所以我想知道是否在哪里可以获取不同文档的数量。 映射: 查询非常简单: 响应: doc_count比命中总数大得多。因此,必须有重复项。 谢谢! 问题答

  • 问题内容: 我正在使用并希望elasticsearch返回搜索的单词而不仅仅是点击。当我搜索单词并且模糊搜索找到单词时,我想知道是谁找到了它。 数据: 查询: 该查询将返回,但不知道是否找到它。 有人知道该怎么做或一个主意吗?我希望输出为。 问题答案: 您可以为此命名查询,方法是为每个查询命名。在结果中,每个匹配都将包含一个数组,其中包含匹配的查询的名称(例如及以下)。

  • 问题内容: 我正在运行以下MySQL查询,以查找没有手册(且车轮有黑轮等)的汽车 查询的结果看起来正确,但是它两次返回ID为27的汽车。如何更改查询,以使所有结果都是唯一的(没有重复项)? 问题答案: 假定这是唯一的主键,那么其中的一种联接将导致笛卡尔乘积。也就是说:或包含多个匹配项。 子查询通常是消除笛卡尔积的好工具。下面的示例查询显示了两种使用子查询的方法。 第一个子查询可确保我们只查看在20

  • 问题内容: 我想将查询发送给ELS,该查询仅返回总点击数。 没有别的 就像我得到回应一样 我只想打印731552 现在我只发送: 卷曲http:// server:9200 / games_profilder / _search 谢谢 问题答案: 您可以为此使用响应过滤: 这将产生 如果您真的只想得到总数,则可以使用以下方法传递结果: 那只会产生数字

  • 问题内容: 我有以下json 我想计算重复的名字 重复计数3 不可重复的名字计数 非重复计数2 我试图计算存储桶的数量,但似乎计算所有存储桶是重复的还是非重复的 问题答案: 好吧,我在这里利用了几种聚合。以下是我使用过的列表。列表的顺序是聚合的执行顺序。 对于重复 术语汇总 统计数据桶汇总 对于非重复 术语汇总 桶选择器 (作为子集合) 总和桶选择器 汇总查询: 响应 注意,在上面的响应中,我们有