我是ElasticSearch的新手,所以请放轻松我。我已经查看了elastic.co并搜索了很多,以找出正确的Java过滤器和查询,以便能够仅提取将在接下来的x天内过期的文档,其中x是用户传入的值应用程序,也是在Elastic中的每个文档上设置的ttl。
我在FilterBuilders上尝试了各种过滤器,例如rangeFilter,boolFilter,它将请求传递给Elastic,如:
Raw Source: {
"from" : 0,
"size" : 20, "filter" : {
"bool" : {
"should" : {
"range" : {
"_ttl" : {
"from" : 2000,
"to" : 2160000000,
"include_lower" : false,
"include_upper" : true
}
}
}
}
},
"explain" : false,
"fields" : [ "_ttl", "_source" ],
"sort" : [ {
"created" : {
"order" : "desc"
}
} ]
}
搜索的Java代码如下:
SearchRequestBuilder srb = client.prepareSearch(index).setTypes(type).addFields("_ttl", "_source")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH).setExplain(false);
if (query != null) srb.setQuery(query);
if (filter != null) srb.setPostFilter(filter);
LOG.debug("Raw Source: {}\n", srb.toString());
// Fetch the Document response from the index
SearchResponse response = srb.execute().actionGet();
传入的过滤器是:
(FilterBuilders.boolFilter().should(FilterBuilders.rangeFilter(_ttl).gt(2000).lte(2160000000)));
其他参数如query,index,type被传递给代码。目前只有索引和类型传递给代码而不是查询(null)
以上对Elastic的查询产生零点击,所以显然有些不对劲。我有多个文件在15天内到期。任何帮助将不胜感激。
由于
答案 0 :(得分:0)
在范围查询中使用_ttl
字段时,您需要指定from / to表示毫秒值而不是天数。
所以在你的情况下,你应该做这样的事情,它会起作用:
// from now
long from = System.currentTimeMillis();
// to 15 days from now
long to = from + (15 * (1000 * 60 * 60 * 24));
FilterBuilders.boolFilter()
.should(FilterBuilders.rangeFilter("_ttl")
.gt(from)
.lt(to));