Lavorare con le gamme di data in Elasticsearch e Symfony2
-
26-12-2019 - |
Domanda
Ho un campo DateTime standard nella mia classe di entità basata su Dottrina:
/**
* @ORM\Column(type="datetime")
*/
private $occurring;
.
Genera un oggetto DateTime e funziona come previsto. Ma un problema si verifica quando questo oggetto è integrato con il foselasmeabundle. A causa degli oggetti DateTime che non supportano il metodo __tostring (), ho dovuto ristrutturare la mia configurazione elastici utilizzando le proprietà in modo che il comando popolare verrà eseguito:
mappings:
id: ~
occurring:
properties:
date: { type: date, format: "yyyy-MM-dd" }
.
Popola la data correttamente ma viene caricata nel formato ELASTICSICSEART predefinito e ignora qualsiasi formattazione personalizzata.
Il problema è che le query della gamma in base a questo campo data non restituiscono i risultati attesi. Il seguente filtro non ritorna nulla anche se ci sono elementi in ELASTICSEARCH all'interno di questo intervallo.
$filteredQuery = new Filtered(
$mainQuery,
new Range('occurring', array(
'gte' => '2013-11-18',
'lte' => '2014-11-18'
))
);
.
La query risultanti quando eseguire direttamente in ELASTICSEARCH tramite Curl restituisce gli stessi risultati errati.
Ho notato che la modifica del Param GTE fino al 2012 ha restituito i risultati attesi nell'intervallo di date 2013, quindi mi chiedo se la formattazione della data errata sta causando il filtro di arrotondare o qualcosa di simile?
Qualche idea? Grazie.
Soluzione
L'ho capito con l'aiuto di questa risposta: Elasticsearch Data intervallo intersezione
.Per ottenere intervalli di data di lavoro correttamente, devi combinare due filtri piuttosto che tentare di farlo in uno:
$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);
.
Questo dà i risultati corretti anche se sono sicuro che ci sia un modo più elegante di costruire la query.