elasticsearch ElasticSearch查询优化器是否理解`{from:null,to:null}`时间范围筛选器是不可操作的?
我使用的是ElasticSearch 1.5.2 在Java中,我编写了如下查询:elasticsearch ElasticSearch查询优化器是否理解`{from:null,to:null}`时间范围筛选器是不可操作的?,elasticsearch,query-optimization,elasticsearch,Query Optimization,我使用的是ElasticSearch 1.5.2 在Java中,我编写了如下查询: publicquerybuilder组合序列( 字符串品牌, 弦积, /**包含的,可为空的*/ 即时启动, /**包含的,可为空的*/ 瞬间结束 ) { final QueryBuilder nominalQuery=QueryBuilders.boolQuery() .must(QueryBuilders.matchQuery(“品牌”,品牌)) .must(QueryBuilders.matchQuery(
publicquerybuilder组合序列(
字符串品牌,
弦积,
/**包含的,可为空的*/
即时启动,
/**包含的,可为空的*/
瞬间结束
) {
final QueryBuilder nominalQuery=QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery(“品牌”,品牌))
.must(QueryBuilders.matchQuery(“产品”,产品));
应用范围为的最终查询生成器;
if(start==null&&end==null){
withRangeApplied=nominalQuery;
}否则{
最终rangeFilter构建器rangeFilter
=FilterBuilders.rangeFilter(“时间戳”);
gte(启动);
lte(结束);
withRangeApplied=QueryBuilders.filteredQuery(
名词查询,
范围滤波器);
}
应用范围内的返回;
}
但是我不喜欢我必须做这个空检查。随着产品的发展,我们的代码库中会有很多这样的代码。我希望所有代码都遵循相同的路径,如下所示:
publicquerybuilder组合序列(
字符串品牌,
弦积,
/**包含的,可为空的*/
即时启动,
/**包含的,可为空的*/
瞬间结束
) {
final QueryBuilder nominalQuery=QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery(“品牌”,品牌))
.must(QueryBuilders.matchQuery(“产品”,产品));
最终rangeFilter构建器rangeFilter
=FilterBuilders.rangeFilter(“时间戳”);
gte(启动);
lte(结束);
返回QueryBuilders.filteredQuery(
名词查询,
范围滤波器);
}
这意味着我们不必要地在查询上强加一个{start:null,end:null}
范围过滤器。这会为ElasticSearch带来额外的工作吗
我使用Profile API(在一个具有类似索引和映射的空ES2.4.1数据库上——这不是一个公平的测试,但是我唯一可用的资源)询问有关查询的一些问题
{start:null,end:null}
在查询计划中显示为:
{
query_type: "MultiTermQueryConstantScoreWrapper",
lucene: "timestamp:[* TO *]",
time: "0.0003ms",
breakdown: {
create_weight: 344
}
}
这个时间比我的“TermQuery”元素小一个数量级。这对我来说是一个相对便宜的过滤器。然而,“非空过滤器”具有完全相同的、微小的时间成本。所以我不相信这是不可能的
此“空筛选器”的存在并没有增加重写时间(与“无筛选器”相比)
而“非空过滤器”的重写时间是“空过滤器”或“空过滤器”的两倍
从这些结果来看:我相信“空过滤器”比“无过滤器”增加的工作量可以忽略不计(事实上,与“非空过滤器”增加的成本可以忽略不计)。有谁能更确切地证实这种无操作滤波器是便宜的(或者是经过优化的)?这并不能回答这个问题,但是
lte(开始)
应该是lte(结束)
。。。我只是想提一下这并不能回答这个问题,但是lte(开始)
应该是lte(结束)
。。。我只是想提一下