在Elasticsearch和Symfony2中使用日期范围

时间:2013-11-18 12:53:14

标签: php datetime symfony elasticsearch elastica

我在基于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 param更改为2012返回了2013日期范围内的预期结果,所以我想知道错误的日期格式是否导致过滤器向上舍入或类似的东西?

有什么想法吗?谢谢。

1 个答案:

答案 0 :(得分:4)

我在这个答案的帮助下想出了这个: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);

这给出了正确的结果,虽然我确信有一种更优雅的方法来构建查询。