現在、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のドキュメントにあるものを模倣しようとしていましたが、私は自分が何をすべきか本当にわからないことを認めます!