c# - ElasticSearch 查询检索书籍的所有标签

标签 c# elasticsearch nest

我有一个 ElasticSearch 数据库,并且有 BooksTags 文档。一本书可以有多个标签。

这里是本书的 C# 类:

[ElasticsearchType(Name = "Book")]
public class Book
{
    [Keyword(Store = false)]
    public string Id{ get; set; }

    [Keyword(Store = false)]
    public string CoverColor{ get; set; } 

    public List<Tag> tags { get; set; }
}

这是该标签的 ElasticSearch 文档:

[ElasticsearchType(Name = "Tag")]
public class Tag
{
    [Keyword(Store = false)]
    public int Id{ get; set; }

    [Keyword(Store = false)]
    public string Name{ get; set; }
}

这是图书文档之一的 JSON 版本:

{
  "_index": "myindex",
  "_type": "Book",
  "_id": "4d43345fffereredwerw324",
  "_score": 1,
  "_source": {
    "id": "123456",
    "coverColor": "Red",
    "tags": [
      {
        "id": 15,
        "name": "fantasy"
      },
      {
        "id": 2,
        "name": "Science fiction"
      }
    ]
  }
}

我想要的是一个查询,它可以检索所有书籍颜色而不重复(假设我有两个红色和四个绿色,我应该得到 1 个红色和 1 个绿色),对于每种颜色我应该得到列表相关标签的数量(例如,基本上相同颜色下的所有标签)

理想的 JSON 输出:

result = [
{
   coverColor: "Red",
   tags: [{ id:1, name:"Fantasy"}, {id: 4, name:"Science fiction"}, {id:33, name:"Novel"}]
},
{
   coverColor: "Green",
   tags: [{id: 4, name:"Science fiction"}]
},
{
   coverColor: "White",
   tags: []
}

最佳答案

我相信您需要使用术语聚合。类似的东西。

var result = client.Search<Book>(s => s
    .Aggregations(a => a
        .Terms("colour_agg", st => st
            .Field(o => o.CoverColor)
            .Size(10)
            .ExecutionHint(TermsAggregationExecutionHint.Ordinals)
        )
    )
);

然后从结果集中检索:

var agg = result.Aggs.Terms("colour_agg");

请求类似于:

GET /cars/transactions/_search?search_type=count
{
  "aggs": {
    "colour_agg": {
      "terms": {
        "field": "CoverColor",
        "size": 10
      }
    }
  }
}

关于c# - ElasticSearch 查询检索书籍的所有标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44799923/

相关文章:

c# - 如何在 MVC razor View 中创建禁用的文本框

c# - 如何构建表达式以从基类调用相等运算符?

Elasticsearch 6.3 绑定(bind)或发布到非环回地址,强制执行 Bootstrap 检查

c# - Elasticsearch/Nest - 将 MatchPhrase 与 OnFieldsWithBoost 结合使用

c# - 默认情况下,查询字段提升权重的最小值和最大值是多少?

针对不同类型的 C# NEST 条件过滤器

c# - 以编程方式为标签分配边距和/或填充

C# 比较两个相同对象类型的列表

elasticsearch - 仅在存在嵌套映射时如何应用过滤器

json - jq可以跨文件执行聚合