这是我按照Dimitris Tsarouhas提供的示例所做的
以下设置允许按关键字过滤,按顺序过滤,并使用公式id
添加所有其他过滤。$boolQuery ->addMust($yourfilter)
我们获取表单发布的关键字。这是$data['query']
默认情况下我们使用它来执行搜索,从而搜索我们文件中_all
列出的所有字段。config.yml
为了执行此搜索,我们使用QueryString
对象,因为这允许我们使用通配符。
然后我们查看变量 是否存在$data['status']
,它通过一个下拉选择框出现(请注意使用 strtolower(),如果没有它,查询将不起作用 - 或者您设置自己的不区分大小写的分析器)。如果是这样,我们用它来过滤我们的结果。
默认情况下,我们还希望缩小搜索范围,只选择活跃用户。
$data = $form->getData();
$finder = $this->container->get('fos_elastica.finder.search.user');
$keyword = $data['query'];
$status= $data['status'];
$keywordQuery = new QueryString;
$keywordQuery->setQuery('*' . $keyword . '*');
$query = new Query();
$query->setQuery($keywordQuery);
$query->setSort(array('id' => array('order' => 'asc')));
$boolQuery = new Bool();
$active= new Term();
$active->setTerm('active', true);
$boolQuery ->addMust($active);
if (!empty($status)) {
$statusQuery = new Term();
$statusQuery->setTerm('status', strtolower($status->getName()));
$boolQuery ->addMust($typeQuery);
}
$query->setFilter($boolQuery);
$entities = $finder->find($query);
当然不要忘记导入必要的库:
use
Elastica\Query\QueryString,
Elastica\Query,
Elastica\Filter\Bool,
Elastica\Filter\Term
;
请记住,为了能够对字段执行操作(搜索、排序等),这些必须包含在您的config.yml
. 当然,这会导致在一般搜索某个实体时自动拾取该字段。因此,如果您需要避免这种情况,但您仍然需要某些字段可供 elastica 使用。只需如下所示定义它:
user:
mappings:
name: ~
surname: ~
status: ~
active: { include_in_all: false }
id: { include_in_all: false }