2017-01-11 15 views
2

ネストでは、私は用語集合を行っています。elasticsearch NEST:bucket.TopHits()を使用せずに直接TopHits結果を取得

また、内部のTopHits集約も行っています。

私の結果は、TopHits()メソッドのおかげで読み取ることができるTopHits値以外のすべての結果情報をレスポンスオブジェクトに与えます。

NEST TopHits()メソッドを使用してaggsに読み込むことなく、結果に直接値を入れたいと思っています。私は弾力的な検索古典的な要求にあるようにすべてのデータを情報にしたいと思います。

私の集約要求:

var response = Client.Search<myclass>(s => s 
            .Type("type") 
             .Aggregations(a => a 
             .Terms("code_bucket", t => t 
             .Field("field_of_aggregation") 
             .Size(30) 
             .Order(TermsOrder.CountAscending) 
             .Aggregations(a2 => a2 
             .TopHits("code_bucket_top_hits", th => th.Size(20)) 
             ) 
             ))); 

を私はTopHits以外のすべてに関する情報にアクセスすることができますウィッヒで結果オブジェクトを受け取り

これは私が実際にやっているものです。

我々は結果を調べる場合、我々はTopHits値がプライベートフィールド「_hits」に格納されて見ることができます:私は結果オブジェクトを文字列化した場合、私はTopHitsの合計数を確認することができ enter image description here

が、私が見ることができませんフィールド_hits私は文書を見ることができるように:

JavaScriptSerializer js = new JavaScriptSerializer(); 
string json = js.Serialize(response); 

JSONはtopHits結果が含まれていません:

enter image description here

私は値にアクセスすることができますが、私は巣の方法TopHits()を使用する必要があります。

var firstBucket= response.Aggs.Terms("code_bucket"); 
foreach (var bucket in firstBucket.Buckets) 
      { 
       var hits = bucket.TopHits("code_bucket_top_hits"); 
       foreach (var hit in hits.Documents<myclass>()) 
       { 
        var prop1= hit.prop1; 
        var prop2= hit.prop2; 
       } 
      } 
    } 

をしかし、私は1つで全てに関する情報を持っていることができれば、我々は巣なしelasticsearch要求を行うときに我々が持っているように、それは、本当にusefuleだろう

方法があるかどうか知っていますか?

+0

など、ストリームを返すために、文字列、または

var searchResponse = client.LowLevel.Search<Stream>("posts", "question", searchRequest); 

を返すために

var searchResponse = client.LowLevel.Search<string>("posts", "question", searchRequest); 

を使用することができます:あなたは、各用語のバケット内のドキュメントを入手できますかあなたは 'bucket.TopHits()'でアクセスできる 'top_hits'集約を使っていますか?あなたは 'bucket.TopHits()'を使わずに他の方法でそれらを取得できるかどうか尋ねていますか? –

+0

はい、私はどんなmethodeを使用せずにまたはすべての結果を検索したいと思います。手動でanswereを構築すると便利ではありません、私はelasticsearch要求を行うとき、私はすべての結果データを持っていたいと思います –

答えて

2

NESTは、強力な型の各リクエストとレスポンスをモデル化し、要求を作成するための流暢かつオブジェクトのイニシャライザ構文と、レスポンスの一部にアクセスするメソッドを提供し、JSONのシリアル化を自分で処理する必要はありません。

ただし、自分で管理したい場合があります。これは自分のやりたいようなものです。このような場合は、Elasticsearch.Netを使用することができます。Elasticsearch.Netは、Elasticsearchの低レベルのクライアントであり、要求と応答をどのようにモデル化するかはわかりません。

NESTの代わりにElasticsearch.Netでクライアントを使用できますが、NESTはカバーの下でElasticsearch.Netを使用し、プロパティでローレベルのクライアントをIElasticClientに公開することをお勧めします。なぜElasticsearch.Netを直接使用するのではなく、NESTで低レベルのクライアントを使用したいのですか?主な理由は、シリアライズのためにNESTのJson.NETの使用を必要とし、それを活用する必要があるときに、要求と応答に強力なタイプを利用できるということです。これを回避し、必要なときに低レベルのクライアントとコールしますに。

は、ここで私は、要求を構築するためにNESTのオブジェクト初期化子の構文を使用しますが、Json.NET JObjectへの応答をデシリアライズするために、低レベルのクライアントを使用することができ、ここでは一例

var client = new ElasticClient(); 

var searchRequest = new SearchRequest<Question> 
{ 
    Size = 0, 
    Aggregations = new TermsAggregation("top_tags") 
    { 
     Field = "tags", 
     Size = 30, 
     Order = new[] { TermsOrder.CountAscending }, 
     Aggregations = new TopHitsAggregation("top_tag_hits") 
     { 
      Size = 20 
     } 
    } 
}; 

var searchResponse = client.LowLevel.Search<JObject>("posts", "question", searchRequest); 

// this will be of type JObject. Do something with it 
searchResponse.Body 

です。選択したTにデシリアライズするには、client.LowLevel.Search<T>()に変更します。あなたは、たとえばそれは、あなたの質問を理解することは困難です

関連する問題