ElasticSearch Java请求在接下来的x天内使文档到期

时间:2016-07-20 20:16:16

标签: java search elasticsearch ttl

我是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天内到期。任何帮助将不胜感激。

由于

1 个答案:

答案 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));