代码之家  ›  专栏  ›  技术社区  ›  Gianluca Ghettini

ElasticSeach查询以检索书籍的所有标记

  •  2
  • Gianluca Ghettini  · 技术社区  · 8 年前

    Books Tags 文件。一本书可以有多个标签。

    [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; }
    }
    

    {
      "_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: []
    }
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   tigerswithguitars    8 年前

    我相信你需要使用术语聚合。有点像。

    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
          }
        }
      }
    }