Elasticsearch NEST 按日期范围过滤
Elasticsearch NEST filter by date range
我正在使用以前从未使用过的 Elastic search .Net NEST 客户端。
我想做的是在评分前按日期范围过滤结果。
我正在使用对象初始化语法,因为它最适合我。
我已经完成了我想要的:
var filter = new FilteredQuery();
var queryForm = new TermQuery();
queryForm.Field = "id";
queryForm.Value = filterModel.Id;
filter.Query &= queryForm;
var rangeQuery = new DateRangeQuery();
rangeQuery.Field = "datetime";
rangeQuery.GreaterThanOrEqualTo = filterModel.DateBegin.Value.AddDays(-1);
rangeQuery.LessThanOrEqualTo = filterModel.DateEnd.Value.AddDays(1);
filter.Filter = rangeQuery;
// Use boolean query
searchRequest.Query = new BoolQuery() && filter;
这给了我请求 JSON 就像我期待的那样:
{
"from": 0,
"size": 0,
"query": {
"filtered": {
"query": {
"bool": {
"must": [
{
"term": {
"id": {
"value": "XXXX"
}
}
}
]
}
},
"filter": {
"range": {
"datetime": {
"gte": "2015-12-31T00:00:00",
"lte": "2016-05-05T00:00:00"
}
}
}
}
}
}
但是关于 filtered query 的文档说 "Deprecated in 2.0.0-beta1. Use the bool query instead with a must clause for the query and a filter clause for the filter"。
由于这是我发现包含过滤器的唯一方法,是否有更好的方法使用 NEST 对象初始化程序语法来执行此操作?
我如何使用 "filter clause for the filter" 或者我必须使用范围查询而忘记过滤器?
谢谢!
有一个 blog post 解释了 ES 2.0 附带的 NEST 2.0 的变化。
为了使用对象初始化语法将 term
和 range
过滤器添加到 bool/filter
查询中,您可以使用新的 +
特殊结构来完成,这将导致 term
查询被包裹在 bool
查询的过滤子句中:
var queryForm = +new TermQuery();
queryForm.Field = "id";
queryForm.Value = filterModel.Id;
var rangeQuery = +new DateRangeQuery();
rangeQuery.Field = "datetime";
rangeQuery.GreaterThanOrEqualTo = filterModel.DateBegin.Value.AddDays(-1);
rangeQuery.LessThanOrEqualTo = filterModel.DateEnd.Value.AddDays(1);
searchRequest.Query = queryForm && rangeQuery
查看更多详情here
我正在使用以前从未使用过的 Elastic search .Net NEST 客户端。 我想做的是在评分前按日期范围过滤结果。
我正在使用对象初始化语法,因为它最适合我。
我已经完成了我想要的:
var filter = new FilteredQuery();
var queryForm = new TermQuery();
queryForm.Field = "id";
queryForm.Value = filterModel.Id;
filter.Query &= queryForm;
var rangeQuery = new DateRangeQuery();
rangeQuery.Field = "datetime";
rangeQuery.GreaterThanOrEqualTo = filterModel.DateBegin.Value.AddDays(-1);
rangeQuery.LessThanOrEqualTo = filterModel.DateEnd.Value.AddDays(1);
filter.Filter = rangeQuery;
// Use boolean query
searchRequest.Query = new BoolQuery() && filter;
这给了我请求 JSON 就像我期待的那样:
{
"from": 0,
"size": 0,
"query": {
"filtered": {
"query": {
"bool": {
"must": [
{
"term": {
"id": {
"value": "XXXX"
}
}
}
]
}
},
"filter": {
"range": {
"datetime": {
"gte": "2015-12-31T00:00:00",
"lte": "2016-05-05T00:00:00"
}
}
}
}
}
}
但是关于 filtered query 的文档说 "Deprecated in 2.0.0-beta1. Use the bool query instead with a must clause for the query and a filter clause for the filter"。
由于这是我发现包含过滤器的唯一方法,是否有更好的方法使用 NEST 对象初始化程序语法来执行此操作? 我如何使用 "filter clause for the filter" 或者我必须使用范围查询而忘记过滤器?
谢谢!
有一个 blog post 解释了 ES 2.0 附带的 NEST 2.0 的变化。
为了使用对象初始化语法将 term
和 range
过滤器添加到 bool/filter
查询中,您可以使用新的 +
特殊结构来完成,这将导致 term
查询被包裹在 bool
查询的过滤子句中:
var queryForm = +new TermQuery();
queryForm.Field = "id";
queryForm.Value = filterModel.Id;
var rangeQuery = +new DateRangeQuery();
rangeQuery.Field = "datetime";
rangeQuery.GreaterThanOrEqualTo = filterModel.DateBegin.Value.AddDays(-1);
rangeQuery.LessThanOrEqualTo = filterModel.DateEnd.Value.AddDays(1);
searchRequest.Query = queryForm && rangeQuery
查看更多详情here