编程语言
首页 > 编程语言> > php-在Elasticsearch和Symfony2中使用日期范围

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