Trabalhando com intervalos de datas no Elasticsearch e Symfony2
-
26-12-2019 - |
Pergunta
Eu tenho um padrão de campo de data / hora na minha Doutrina baseada em entidade de classe:
/**
* @ORM\Column(type="datetime")
*/
private $occurring;
Isso gera um objeto DateTime e funciona como esperado.Mas ocorre um problema quando esse objeto é integrado com o FOSElasticaBundle.Devido a data e hora de objetos de não apoiar o __método toString (), tive de reestruturar minha Elastica de configuração usando as propriedades para que o preencher comando será executado:
mappings:
id: ~
occurring:
properties:
date: { type: date, format: "yyyy-MM-dd" }
Isso preenche a data corretamente, mas ele carrega no padrão Elasticsearch formato e ignora qualquer formatação personalizada.
O problema é que a minha intervalo de consultas baseado neste campo de data não retornar os resultados esperados.O seguinte filtro retorna nada até que haja itens no Elasticsearch dentro deste intervalo.
$filteredQuery = new Filtered(
$mainQuery,
new Range('occurring', array(
'gte' => '2013-11-18',
'lte' => '2014-11-18'
))
);
A consulta resultante quando executados diretamente no Elasticsearch via curl retorna os mesmos resultados incorretos.
Fiz notar que a mudança do gte param para 2012 devolvidos os resultados esperados em 2013 intervalo de data, então eu estou querendo saber se a data incorreta de formatação está a causar o filtro para arredondar para cima ou algo semelhante?
Qualquer idéias?Obrigado.
Solução
Achei isso com a ajuda da sua resposta: Elasticsearch intervalo de data de intersecção
Para obter intervalos de data funcionar corretamente, você terá que combinar dois filtros em vez de tentar fazê-lo em:
$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);
Isto dá os resultados corretos, embora eu tenho certeza que há uma forma mais elegante de construção da consulta.