php-在Elasticsearch和Symfony2中使用日期范围
作者:互联网
我在基于Doctrine的实体类中有一个标准的Datetime字段:
/**
* @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年日期范围内的预期结果,所以我想知道日期格式不正确是否会导致过滤器四舍五入或类似?
有任何想法吗?谢谢.
解决方法:
我在以下答案的帮助下找到了答案: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);
尽管我敢肯定有一种构造查询的更优雅的方法,但这可以给出正确的结果.
标签:elasticsearch,symfony,elastica,datetime,php 来源: https://codeday.me/bug/20191030/1965940.html