質問

私のDoctrineベースのエンティティクラスに標準の日時フィールドを持っています:

/**
 * @ORM\Column(type="datetime")
 */
private $occurring;
.

これはDateTimeオブジェクトを生成し、期待どおりに機能します。しかし、このオブジェクトがfoselasticAbundleと統合されているときに問題が発生します。 DateTimeオブジェクトが__toString()メソッドをサポートしていないため、Populateコマンドが実行されるように、プロパティを使用してElastica Configを再構築しなければなりませんでした。

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で直接実行されたときのクエリは、同じ誤った結果を返します。

私は2013年の日付範囲でGTE PARAMを2012年に変更したことに気付きましたので、誤った日付の書式設定がフィルタを切り上げたり、似たようなものになるのか疑問に思いますか?

任意のアイデア?ありがとう。

役に立ちましたか?

解決

この回答の助けを借りてこれを考え出した: Elasticsearch Date Range InterSection

日付範囲を正しく機能させるには、2つのフィルタを1つで行うのではなく、2つのフィルタを組み合わせる必要があります。

$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);
.

これは正しい結果を与えていますが、私はクエリを構築するよりエレガントな方法があると確信しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top