【问题标题】:ElasticSearch Java Request to get documents expiring in next x daysElasticSearch Java 请求获取在未来 x 天到期的文档
【发布时间】:2016-11-24 05:03:10
【问题描述】:

我是 ElasticSearch 的新手,所以请放轻松。我查看了 elastic.co 并搜索了很多内容以找出正确的 Java 过滤器和查询,以便仅提取将在接下来 x 天到期的文档,其中 x 是用户传入的值应用程序,也是 Elastic 中每个文档上设置的 ttl。

我在将请求传递给 Elastic 的 FilterBuilders 上尝试了各种过滤器,例如 rangeFilter、boolFilter,例如:

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

查询、索引、类型等其他参数被传递到代码中。目前只有索引和类型被传递给代码而不是查询(空)

上述对 Elastic 的查询产生零命中,因此显然有些问题。我确实有多个文件在 15 天内到期。任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 你用的是什么版本的ES?
  • 使用版本 0.90.10

标签: java search elasticsearch ttl


【解决方案1】:

在范围查询中使用 _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));

【讨论】:

  • 感谢您的建议,但我仍然获得 0 次点击。
  • 您能否分享您正在生成的原始源代码以及您最新的 Java 代码?
  • 如果你用这些更新你的问题会更好,它会更清晰。
  • 你能不能说明你是如何索引 TTL 值为 15 天的文档的?
  • 我已经用原始源代码和 Java 代码更新了原始问题。我们有成千上万的文档,它们的生存时间从几天到一年不等(我使用的一个例子是 15 天)。我们更新了文档的映射以启用 _ttl,然后在索引时在文档上以毫秒为单位设置 _ttl(首先将天转换为毫秒)。 client.prepareIndex(index, type, id).setTTL(newttl).setSource(payload).execute().actionGet();谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-07
  • 1970-01-01
相关资源
最近更新 更多