我在基于 Doctrine 的实体类中有一个标准的 Datetime 字段:
/**
* @ORM\Column(type="datetime")
*/
private $occurring;
这会生成一个 DateTime 对象并按预期工作。但是当这个对象与 FOSElasticaBundle 集成时会出现问题。由于 DateTime 对象不支持 __toString() 方法,我不得不使用属性重构我的 Elastica 配置,以便运行填充命令:
mappings:
id: ~
occurring:
properties:
date: { type: date, format: "yyyy-MM-dd" }
这会正确填充日期,但会以默认的 Elasticsearch 格式加载并忽略任何自定义格式。
问题是我基于这个日期字段的范围查询没有返回预期的结果。即使 Elasticsearch 中的项目在此范围内,以下过滤器也不会返回任何内容。
$filteredQuery = new Filtered(
$mainQuery,
new Range('occurring', array(
'gte' => '2013-11-18',
'lte' => '2014-11-18'
))
);
通过 curl 在 Elasticsearch 中直接运行时生成的查询返回相同的错误结果。
我注意到将 gte 参数更改为 2012 会返回 2013 年日期范围内的预期结果,所以我想知道是否错误的日期格式导致过滤器四舍五入或类似的事情?
有什么想法吗?谢谢。
最佳答案
我在这个答案的帮助下解决了这个问题:Elasticsearch date range intersection
要使日期范围正常工作,您必须组合两个过滤器而不是尝试在一个过滤器中进行:
$rangeLower = new Filtered(
$mainQuery,
new Range('occurring', array(
'gte' => '2013-11-13'
))
);
$rangeUpper = new Filtered(
$rangeLower,
new Range('occurring', array(
'lte' => '2014-11-14'
))
);
$query = new Query($rangeUpper);
这给出了正确的结果,尽管我确信有一种更优雅的构造查询的方法。
关于php - 在 Elasticsearch 和 Symfony2 中处理日期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20048312/