1

現在、FOQElasticaBundleを使用してelasticsearchサーバーとやり取りしていますが、各エンティティの「アクティブ」フラグに基づいて検索結果を制限する方法が見つからないようです。どういうわけか構成でこれを設定することは可能ですか?これが私の現在の設定です:

foq_elastica:
    clients:
        default: { host: localhost, port: 9200 }

    indexes:
        website:
            client: default
            types:
                story:
                    mappings:
                        title: { boost: 8 }
                        summary: { boost: 5 }
                        text: { boost: 3 }
                        author:
                    persistence:
                        driver: orm # orm, mongodb, propel are available
                        model: Joe\Bundle\StoryBundle\Entity\Story
                        provider:
                        listener:
                        finder:

コントローラー/ビューレベルで非アクティブなストーリーを除外することはできません。これはページネーションを台無しにするためです。ページごとに一定数のアイテムが必要になるため、検索activeでfalse(または0)。これは可能であるに違いないと思いますが、誰もがその方法を知っています。

ありがとう。

編集

プロバイダーのカスタムquery_builder_methodを指定することができなかった後、代わりにカスタムリポジトリを指定して、クエリを作成することにしました。しかし、私もこれを機能させることができていません。これが私の検索方法です:

public function findByQueryString($queryString)
{

    $builder = new \Elastica_Query_Builder();
    $builder
        ->queryString()
            ->field('query', $queryString)
        ->queryStringClose()
        ->filter()
            ->term()
                ->field('active', 1)
            ->termClose()
        ->filterClose()
    ;
    // TODO check published date...

    return $this->findPaginated($builder);
}

これにより、次のJSONが生成されます。

{
    "query": {
        "query_string": {
            "query": "story"
        },
        "filter": {
            "term": {
                "active": "1"
            }
        }
    },
    "from": 0,
    "size": 10
}

しかし、何らかの理由でフィルターの「用語」部分が気に入らないようです。私はelasticsearchのドキュメントにあるものを模倣しようとしていましたが、私は自分が何をすべきか本当にわからないことを認めます!

4

2 に答える 2

2

はい、を使用することで可能Doctrine query builderです。ここを読んでください

    persistence:
            driver: orm
            model: Application\UserBundle\Entity\User
            provider:
                query_builder_method: createIsActiveQueryBuilder
于 2012-07-25T19:29:27.953 に答える
0

OK、これは3年前のことですが、新しい読者はこの回答を読みたいと思うかもしれません。

==>それは実際には非常に単純で、作業を必要としません。

たとえば、「公開された」ブールフィールドを持つPostエンティティがあります。エンティティクラスにこのフィールドのゲッターがあることを確認してください。この例では、ゲッターはgetPublishedです。次に、構成ファイルでリスナーをそのように構成するだけです。

 persistence:
     listener:
         is_indexable_callback: "getPublished"

これがドキュメントです

于 2016-04-03T14:22:09.303 に答える