Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ElasticSearch查询以检索书籍的所有标记_C#_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Nest - Fatal编程技术网 elasticsearch,nest,C#,elasticsearch,Nest" /> elasticsearch,nest,C#,elasticsearch,Nest" />

C# ElasticSearch查询以检索书籍的所有标记

C# ElasticSearch查询以检索书籍的所有标记,c#,elasticsearch,nest,C#,elasticsearch,Nest,我有一个ElasticSearch数据库,我有书籍和标签文档。一本书可以有多个标签 这是本书的C#类: [ElasticsearchType(Name = "Book")] public class Book { [Keyword(Store = false)] public string Id{ get; set; } [Keyword(Store = false)] public string CoverColor{ get; set; } pu

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

这是本书的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; }
}
这是其中一本书文档的JSON版本:

{
  "_index": "myindex",
  "_type": "Book",
  "_id": "4d43345fffereredwerw324",
  "_score": 1,
  "_source": {
    "id": "123456",
    "coverColor": "Red",
    "tags": [
      {
        "id": 15,
        "name": "fantasy"
      },
      {
        "id": 2,
        "name": "Science fiction"
      }
    ]
  }
}
我想要的是一个查询,它检索所有的书籍颜色而不重复(假设我有两个红色和四个绿色,我应该得到一个红色和一个绿色),对于每种颜色,我应该得到相关标签的列表(例如,基本上相同颜色下的所有标签)

理想的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)
        )
    )
);
请求看起来像:

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

明亮的你能告诉我这个查询的kibana版本吗?这样我就可以测试它,如果需要的话可以调整它。。非常感谢:-)在编辑后的答案中。。。在我回答后,您将标签添加到问题中。这有点复杂。您需要仔细阅读“嵌套聚合”和可能的“反向嵌套聚合”。但是这应该可以让您开始了。@GianlucaGhettini您可以使用
.OnRequestCompleted()
以及
连接设置
上的
.DisableDirectStreaming()
:或使用
.SerializeToString()获取序列化查询json
IElasticClient.Serializer上的
,并将搜索请求传递给它/descriptor@RussCam嗨,罗斯,很高兴再次收到你的来信!我对这个问题投了更高的票,但它实际上并没有解决我的问题,看起来它需要某种嵌套聚合,您想看看吗?
var agg = result.Aggs.Terms("colour_agg");
GET /cars/transactions/_search?search_type=count
{
  "aggs": {
    "colour_agg": {
      "terms": {
        "field": "CoverColor",
        "size": 10
      }
    }
  }
}