【问题标题】:Working with date ranges in Elasticsearch and Symfony2在 Elasticsearch 和 Symfony2 中使用日期范围
【发布时间】:2013-11-18 12:53:14
【问题描述】:

我的基于 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 年日期范围内的预期结果,所以我想知道不正确的日期格式是否导致过滤器四舍五入或类似情况?

有什么想法吗?谢谢。

【问题讨论】:

    标签: php datetime symfony elasticsearch elastica


    【解决方案1】:

    我在这个答案的帮助下解决了这个问题: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);
    

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

    【讨论】:

      猜你喜欢
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-23
      • 2015-10-24
      • 1970-01-01
      • 2016-03-15
      相关资源
      最近更新 更多