elasticsearch,Java,elasticsearch" /> elasticsearch,Java,elasticsearch" />

Java 弹性搜索范围日期

Java 弹性搜索范围日期,java,elasticsearch,Java,elasticsearch,我已经从Mongo数据库创建了一个弹性搜索索引。 Mongo中的文档具有以下结构: { "_id" : ObjectId("525facace4b0c1f5e78753ea"), "time" : ISODate("2013-10-17T09:23:56.131Z"), "type" : "A", "url" : "www.google.com", "name" : "peter", } 索引创建(显然)没有任何问题。 现在,我尝试使用弹性搜索来检索索引

我已经从Mongo数据库创建了一个弹性搜索索引。 Mongo中的文档具有以下结构:

{
    "_id" : ObjectId("525facace4b0c1f5e78753ea"),
    "time" : ISODate("2013-10-17T09:23:56.131Z"),
    "type" : "A",
    "url" : "www.google.com",
    "name" : "peter",
}
索引创建(显然)没有任何问题。 现在,我尝试使用弹性搜索来检索索引中两个日期之间的文档。我已经读到我必须使用范围查询,但我已经尝试过很多次了,比如

MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("name", "peter").type(Type.PHRASE).minimumShouldMatch("99%");
LocalDateTime toLocal = new LocalDateTime(2013,12,18, 0, 0);
Date to = toLocal.toDate();
LocalDateTime fromLocal = new LocalDateTime(2013,12,17, 0, 0);
Date from = fromLocal.toDate();
RangeQueryBuilder queryDate = QueryBuilders.rangeQuery("time").to(to).from(from);
FilterBuilder filterDate = FilterBuilders.queryFilter(queryDate);       

srb = esH.client.prepareSearch("my_index");
srb.setQuery(queryBuilder);
srb.setFilter(filterDate);
sr = srb.execute().actionGet();
虽然应该有很多结果,但我得到了0个点击。我尝试输入字符串而不是日期,但结果相同

当我执行基本查询而不使用以下筛选器时:

MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("name", "peter").type(Type.PHRASE).minimumShouldMatch("99%");

SearchRequestBuilder srb = esH.client.prepareSearch("my_index");
rb.setQuery(queryBuilder);
SearchResponse sr = srb.execute().actionGet();
我得到的点击率如下所示:

{
"_index" : "my_index",
"_type" : "type",
"_id" : "5280d3c2e4b05e95aa703e34",
"_score" : 1.375688, "_source" : {"type":["A"],"time":["Mon Nov 11 13:55:30 CET 2013"],"name":["peter"]}
}
其中,字段
time
不再具有格式
ISODate(“2013-10-17T09:23:56.131Z”)


总之,考虑到格式,在两个日期(和时间)之间进行查询的Java代码(和类型)是什么?

您可能将错误的字段名传递到了此行的范围查询:


RangeQueryBuilder queryDate=QueryBuilders.rangeQuery(“时间”).to(to.from(from);

它可能应该是
@timestamp
(或者您用来存储时间戳的字段),而不是
time
。此外,在Elasticsearch中似乎没有
时间
字段来搜索您包含的示例文档。这也指出了
time
字段没有从Mongo正确转换为Elasticsearch的问题。

您能试试吗

FilterBuilders.rangeFilter("@timestamp").from("from time").to("toTime")
这会奏效的-

您可以向gte和lte参数传递长时间戳

QueryBuilders.rangeQuery(“time”).gte(startTime).lte(endTime)


确保在startTime和endTime的末尾添加一个“L”,以便它知道这是一个long而不是int。

能否添加生成器生成的实际JSON查询?很难在看不到ES实际看到的情况下说出发生了什么。这是不推荐的还是什么?因为它不起作用。