В настоящее время я использую 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
ложная ( или 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, но я признаю, что не знаю, что я должен делать!
Да, это возможно с помощью Doctrine query builder
. Читайте здесь .
persistence: driver: orm model: Application\UserBundle\Entity\User provider: query_builder_method: createIsActiveQueryBuilder
ОК это было 3 года назад, но новые читатели могли бы прочитать этот ответ.
==> Это актуально очень просто и не требует никакой работы.
Например, у меня есть объект Post с «опубликованным» логическим полем. Не забудьте указать получателя этого поля в классе объектов. В этом примере получатель getPublished. Тогда вы можете просто настроить прослушиватель в вашем файле конфигурации таким образом.
persistence: listener: is_indexable_callback: "getPublished"
Вот документ