2017-06-28 15 views
2

私はElasticSearchデータベースを持っており、BooksTagsのドキュメントを持っています。ブックには複数のタグがあります。書籍のすべてのタグを取得するためのElasticSeachクエリ

ここ

ブックのための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; } 
} 

これは、ブックドキュメントの1つのJSONバージョンです:

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

私が持っていたいのは、繰り返しを使わずにすべての本の色を検索するクエリです(私は2つのレッドと4つのグリーンを持っているとしましょう、私は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: [] 
} 

答えて

2

あなたは、私は信じている利用規約集約を使用する必要があります。何かのようなもの。これは、その後、このように設定された結果から取得される

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

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

要求は次のようになります!あなたが私にそれをテストし、必要な場合はそれを微調整することができますので、キバナバージョンの質問を教えてください。多くのありがとう:-) –

+0

編集された答えで...私は答えた後にタグ集計を質問に追加しました。それは少し複雑です。あなたは 'ネストされた集約'とおそらく '逆ネストされた集約'を読み上げる必要があります。しかし、これはあなたを開始する必要があります。 – tigerswithguitars

+0

@GianlucaGhettiniでは、 'ConnectionSettings'で' .OnRequestCompleted() 'と' .DisableDirectStreaming() 'を使ってシリアライズされたクエリjsonを得ることができます:https://www.elastic.co/guide/en/elasticsearch/client/net- IElasticClient.Serializerの '.SerializeToString()'を使用して、検索要求/記述子を渡します。 –

関連する問題