我目前正在使用FOQElasticaBundle与我的弹性搜索服务器进行交互,但我似乎找不到基于每个实体上的"活动"标志来限制搜索结果的方法。有可能以某种方式在配置中设置此项吗?这是我当前的配置:
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
}
但出于某种原因,它似乎不喜欢过滤器中的"术语"部分。我只是想模仿弹性搜索文档中的内容,但我承认我真的不知道该做什么!
是的,可以使用Doctrine query builder
。请阅读此处。
persistence:
driver: orm
model: Application'UserBundle'Entity'User
provider:
query_builder_method: createIsActiveQueryBuilder
好吧,这是3年前的事了,但新读者可能喜欢读这个答案。
===>它实际上非常简单,不需要任何工作。
例如,我有一个带有"已发布"布尔字段的Post实体。请确保在实体类中具有该字段的getter。在本例中,getter是getPublished。然后,您可以通过这种方式在配置文件中简单地配置侦听器。
persistence:
listener:
is_indexable_callback: "getPublished"
这是文档