這裏是我做了以下的例子中所提供的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
;
記住,要能夠對字段執行操作(搜索,排序等),這些haveto包含在您config.yml
。當然,這會在通常搜索某個實體時自動拾取該字段。因此,如果您需要避免這種情況,但您仍然需要某些字段可供elastica使用。只需將其定義爲如下所示:
user:
mappings:
name: ~
surname: ~
status: ~
active: { include_in_all: false }
id: { include_in_all: false }