bor*_*ris 4 c# elasticsearch nest
我正在使用以前从未使用过的弹性搜索.Net NEST客户端.我想要做的是在得分之前按日期范围过滤结果.
我正在使用Object初始化器语法,因为它最适合我.
我完成了我想要的东西:
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;
Run Code Online (Sandbox Code Playgroud)
这给了我像我期望的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"
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但有关已过滤查询的文档显示"在2.0.0-beta1中已弃用.请使用bool查询,而使用查询的must子句和过滤器的过滤子句".
因为这是我发现包含过滤器的唯一方法是使用NEST Object初始化器语法有更好的方法吗?我如何使用"过滤器的过滤子句"或者我必须使用范围查询并忘记过滤器?
谢谢!
有一篇博客文章解释了ES 2.0附带的NEST 2.0的变化.
为了使用Object Initializer语法将您的term和range过滤器添加到bool/filter查询中,您可以使用新的+特殊构造来完成它,这将导致term查询被包装在bool查询的filter子句中:
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
Run Code Online (Sandbox Code Playgroud)
在这里查看更多细节