0

FosElasticaBundle (@dev) を使用して Symfony 2.5.6 プロジェクトに参加しています。

私のプロジェクトでは、Elastic Search でのリクエストの合計ヒット数を取得する必要があります。つまり、通常のリクエストで Elastic Search にクエリを実行していますが、特別な「カウント」URL を使用しています。

localhost:9200/_search?search_type=count

「search_type=count」URL パラメータに注意してください。

クエリの例を次に示します。

{
  "query": {
    "filtered": {
      "query": {
        "match_all": []
      },
      "filter": {
        "bool": {
          "must": [
            {
              "terms": {
                "media.category.id": [
                  681
                ]
              }
            }
          ]
        }
      }
    }
  },
  "sort": {
    "published_at": {
      "order": "desc"
    }
  },
  "size": 1
}

結果には通常の JSON 応答が含まれますが、 partにドキュメントはありませんhits。この応答から、合計数を簡単に取得できます。

{
    "took": 1,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "failed": 0
    },
    "hits": {
        "total": 81,
        "max_score": 0,
        "hits": [ ]
    }
}

わかりましたhits.total == 81

今、リポジトリから FOSElasticaBundle を介して同じことを行うソリューションを見つけることができませんでした。

私はこれを試しました:

$query = (...) // building the Elastica query here
$count = $this->finder->findPaginated(
    $query,
    array(ES::OPTION_SEARCH_TYPE => ES::OPTION_SEARCH_TYPE_COUNT)
)->getNbResults();

しかし、クラス「Pag​​erfanta」をロードしようとしました。私はPagerfantaを望んでいません。

次に、これ:

$count = $this->finder->createPaginatorAdapter(
    $query,
    array(ES::OPTION_SEARCH_TYPE => ES::OPTION_SEARCH_TYPE_COUNT)
)->getTotalHits();

しかし、それは常に私に0を与えます。

リポジトリから Elastica Finder サービスにアクセスできれば簡単です (その後、クエリ検索から ResultSet を取得でき、この ResultSet には正しい getTotalHits() メソッドがあります)。しかし、リポジトリからのサービス...ご存知のとおりです。

助けや手がかりをありがとう!

4

3 に答える 3

1

わかりました、では、どうぞ: それは不可能です .

バージョン 3.1.x-dev (2d8903a) の時点では、FOSElasticaBundle からエラスティック検索によって返される一致するドキュメントの合計数を取得することはできません。これは、このバンドルがこの値を公開していないためです。

メソッドには次のRawPaginatorAdapter::getTotalHits()コードが含まれます。

return $this->query->hasParam('size')
    ? min($this->totalHits, (integer) $this->query->getParam('size'))
    : $this->totalHits;

これにより、$this->totalHits実際にドキュメントを必要とせずに正しい情報を取得できなくなります。実際、サイズを 0 に設定すると、elasticsearch にドキュメントを返さないように指示し、メタ情報のみRawPaginatorAdapter::getTotalHits()が 0 を返します。

そのため、FosElasticaBundle は、この総ヒット数を知る方法を提供していません。Elastica ライブラリを介して直接行うことしかできませんでした。もちろん、Elastica finder がネイティブで利用できるという欠点があります\FOS\ElasticaBundle\Repository。リポジトリ用の FOSElasticaBundle の代わりに、新しいサービスを作成し、インジェクションを行い、サービスを起動する必要がありました。

別のパスを選択し、 https://github.com/FriendsOfSymfony/FOSElasticaBundleをフォークし、メソッド コードを次のように変更しました。

/**
 * Returns the number of results.
 *
 * @param boolean $genuineTotal make the function return the `hits.total`
 * value of the search result in all cases, instead of limiting it to the
 * `size` request parameter.
 * @return integer The number of results.
 */
public function getTotalHits($genuineTotal = false)
{
    if ( ! isset($this->totalHits)) {
        $this->totalHits = $this->searchable->search($this->query)->getTotalHits();
    }

return $this->query->hasParam('size') && !$genuineTotal
    ? min($this->totalHits, (integer) $this->query->getParam('size'))
    : $this->totalHits;
}

$genuineTotalboolean は、BC ブレークを導入することなく、elasticsearch の動作を復元します。$ignoreSize名前を付けて、逆の方法で使用することもできます。

プル リクエストを開きました: https://github.com/FriendsOfSymfony/FOSElasticaBundle/pull/748

見てみましょう!それがたった一人の人を助けることができれば、私はすでに幸せです!

于 2014-11-27T10:32:22.503 に答える