Php 在Elasticsearch和Symfony2中使用日期范围
我在基于条令的实体类中有一个标准日期时间字段:Php 在Elasticsearch和Symfony2中使用日期范围,php,datetime,symfony,
elasticsearch,elastica,Php,Datetime,Symfony,
elasticsearch,Elastica,我在基于条令的实体类中有一个标准日期时间字段: /** * @ORM\Column(type="datetime") */ private $occurring; 这将生成DateTime对象并按预期工作。但当该对象与FOSElasticaBundle集成时会出现问题。由于DateTime对象不支持_toString()方法,因此我必须使用属性重新构造Elastica配置,以便运行populate命令: mappings: id: ~ occurring:
/**
* @ORM\Column(type="datetime")
*/
private $occurring;
这将生成DateTime对象并按预期工作。但当该对象与FOSElasticaBundle集成时会出现问题。由于DateTime对象不支持_toString()方法,因此我必须使用属性重新构造Elastica配置,以便运行populate命令:
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年日期范围内的预期结果,因此我想知道不正确的日期格式是否会导致过滤器进行取整或类似操作
有什么想法吗?谢谢 我通过这个答案解决了这个问题: 要使日期范围正常工作,您必须组合两个筛选器,而不是尝试在一个筛选器中完成:
$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);
这会给出正确的结果,尽管我确信有一种更优雅的方法来构造查询