this question - get unique user within timespanの後に、指定したタイムパン内にのみ出現するユーザーを除外したいと思います。弾性検索ネスト。別のタイムスパンを除いた時間間隔内で集計結果を得る
例では、を2016年にのみ訪問したが、2017年には訪問しなかったユーザーのリストです。これは、ユーザが2017
にも表示される可能性があるため、フィルタを2016
回だけ使用した場合には当てはまりません。したがって、可能な試行は[2016..2017 users] - [2017 users]
を設定することです。
私の裁判は、2つのクエリ([2016..2017 users]
と[2017 users]
)をESに送信し、アプリケーションでuserList_20162017.Except(userList_2017)
を使用して除外しました。
しかし、これは非常に非効率的なアプローチだと思います。私たちはElasticSearch NESTクエリでのみそれを達成できますか?
void Main()
{
var client = new ElasticClient(connectionSettings);
var twoYearsAgo = new DateTime(2016,1,1);
var yearAgo = new DateTime(2017,1,1);
// get 2016..2017 users
var searchResponse20162017 = client.Search<Visitor>(s => s
.Size(0)
.Query(q => q
.DateRange(c => c.Field(p => p.CreationDate)
.GreaterThan(twoYearsAgo)
.LessThan(DateeTime.UtcNow)
)
)
.Aggregations(a => a
.Terms("unique_users", c => c
.Field(f => f.OwnerUserId)
.Size(int.MaxValue)
)
)
);
// get 2017 users
var searchResponse2017 = client.Search<Visitor>(s => s
.Size(0)
.Query(q => q
.DateRange(c => c.Field(p => p.CreationDate)
.GreaterThan(yearAgo)
.LessThan(DateeTime.UtcNow)
)
)
.Aggregations(a => a
.Terms("unique_users", c => c
.Field(f => f.OwnerUserId)
.Size(int.MaxValue)
)
)
);
var uniqueUser20162017 = searchResponse20162017.Aggs.Terms("unique_users").Buckets.Select(b => b.KeyAsString).ToList();
var uniqueUser2017 = searchResponse2017.Aggs.Terms("unique_users").Buckets.Select(b => b.KeyAsString).ToList();
// Final result. seems so naïve and inefficient.
var uniqueUser2016Only = searchResponse20162017.Except(searchResponse2017);
}
ありがとうございます! :)クエリで '+ q'や'!+ ff'構文に関するドキュメントが見つかりません。私にそれのためのリンクを与えることができますか? – Youngjae
@Youngjae 'bool'クエリドキュメントを見てください:https://www.elastic.co/guide/en/elasticsearch/client/net-api/5.x/bool-queries.html私は新しい次のような演算子について詳しく説明しているウェブサイトのドキュメントをご覧ください:https://github.com/elastic/elasticsearch-net/blob/enhancement/great-docs-update/docs/query-dsl/bool-dsl/bool-dsl.asciidoc –