6

FOS Elastica を使用するリポジトリの単体テストを行っていますが、配列形式ではなく、クエリの文字列バージョンを取得する方法を誰かが知っているかどうか疑問に思っていました。これが私のリポジトリメソッドです:

    /**
     * Creates query object by either first or last name, with given parameters
     *
     * @param $name
     *
     * @param array $params
     *
     * @return Query
     */
    public function findByFirstOrLast($name, array $params)
    {
        $queryString = new QueryString();
        $queryString->setQuery($name);
        $queryString->setFields(array('firstName', 'lastName'));


        $query = new Query();
        $query->setQuery($queryString);
        $query->setSort(array($params['sort'] => array('order' => $params['direction'])));

        return $query;
    }

$name = 'foo';(そして私は id でソートしていると仮定すると)、対応する FOS Elastica クエリは次のようになるはずです。

{
    "query":
    {
        "query_string":
            {
                "query":
                    "foo",
                    "fields":["firstName","lastName"]
            }
    },
    "sort":
    {
      "id":
          {
              "order":"asc"
          }
    }
}

クエリのこのjson文字列表現を取得する方法を知っている人はいますか? 必ずしもこのきれいな形式である必要はありません。1 行の文字列でもかまいません。

4

2 に答える 2

16

もうこれを使用していないようですが、結局同じものが必要になりました。

return $query の直前に json_encode($query->getQuery()->toArray()) を使用すると、必要なものが 1 行の文字列として得られます。

于 2014-08-20T14:54:39.937 に答える
1

質問への直接的な回答ではありませんが、非常に関連しています。found.noのようなツールを使用してElasticsearchクエリをテストする場合、次のように found.no エディターに貼り付けることができるように、出力を YAML として取得すると興味深い場合があります。

query:
    filtered:
    query:
        multi_match:
            query: php
            operator: AND
            fields:
                - field1^30
                - field2
                - field3                    
                - _all

次の関数を使用して、この種の出力を得ることができます。

use Elastica\Query;
use Symfony\Component\Yaml\Dumper;

/**
 * @param Query $query
 * @param bool  $asYaml
 */
protected function debugQuery(Query $query, $asYaml = false)
{
    echo '<pre>';
    $debug = ['query' => $query->getQuery()->toArray()];

    if (false === $asYaml) {
        echo json_encode($debug, JSON_PRETTY_PRINT);
        die();
    }

    $dumper = new Dumper();
    $yaml = $dumper->dump($debug, 100);

    echo $yaml;
    die();
}

したがって、どちらの形式も選択できます。

于 2015-11-20T16:04:02.297 に答える