【问题标题】:TermsAggregation on Array数组上的术语聚合
【发布时间】:2020-05-24 14:22:11
【问题描述】:

有一个索引字段的问题,该索引字段以方式存储字符串列表

["abc_def_fgh","abc_def_fgh","123_345_456"]

我正在尝试使用 TermsAggregation 来获取

"abc_def_fgh" (2) “123_345_456”(1)

但不能让它工作,因为它会导致每个术语的计数(abc (2)、def(2) 等)

有什么想法吗?

非常感谢

【问题讨论】:

  • 也许可以共享一些代码,以便我们了解上下文。这取决于您使用的分析器和标记器。也许 elasticsearch 会去掉 unsercore 并将短语分成不同的单词
  • 嗨 MaxG,感谢您的回答。我尝试更改其他字符(甚至是奇怪字符)的下划线,它也是如此。关于代码无非是将带有字段名称的 TermsAggregation 对象添加到聚合中(我使用嵌套客户端)我是弹性的新手,所以我有点迷路,但会看看分析器和标记器。用工具导入索引并放标准分析器谢谢
  • 您尝试为其创建聚合的该字段的映射类型是什么?
  • 嗨,是一个存储字符串数组的文本字段

标签: elasticsearch nest elasticsearch-aggregation


【解决方案1】:

试试类似的东西

var result = await client.SearchAsync<Document>(s => s
    .Size(0)
    .Aggregations(a => a
        .Terms("tags", t => t.Field(f => f.Tags.Suffix("keyword")))));

foreach (var bucket in result.Aggregations.Terms("tags").Buckets)
{
    System.Console.WriteLine($"Tag {bucket.Key}, doc count: {bucket.DocCount}");
}

public class Document
{
    public string Id { get; set; }
    public string[] Tags { get; set; } = { };
}

对于我索引中的这三个文档

new Document {Id = "1", Tags = new[]{"a","b"}
new Document {Id = "2", Tags = new[]{"a"}
new Document {Id = "3", Tags = new[]{"c"}

它会输出

Tag a, doc count: 2
Tag b, doc count: 1
Tag c, doc count: 1

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    这听起来像是一个映射问题。您需要确保使用 keyword 而不是 text。您不希望在使用聚合时分析该字段。

    【讨论】:

      猜你喜欢
      • 2017-10-27
      • 2014-07-09
      • 1970-01-01
      • 2021-06-06
      • 1970-01-01
      • 2022-01-19
      • 2018-08-23
      • 2021-06-06
      • 1970-01-01
      相关资源
      最近更新 更多