我正在将我的类重新命名为Elastica的新逻辑,并想知道我是否采用了正确的方法。
我对带过滤器的查询的实际解决方案是:
<?php
// Create the actual search query
$elasticaQuery = new Elastica\Query();
$query = new Elastica\Query\MultiMatch();
$query->setQuery($queryParam);
$query->setFields(array('title^12', 'description', 'company_name'));
$query->setType("cross_fields");
$query->setOperator("and");
// check for filter
if(!is_null($type_id)){
//create bool query object
$elasticaFilterBool = new Elastica\Filter\BoolFilter();
// the term
$filter1 = new Elastica\Filter\Term();
$filter1->setTerm('job_type_id', (int)$type_id);
$elasticaFilterBool->addMust($filter1);
// add the filter to the queryObject
$elasticaQuery->setPostFilter($elasticaFilterBool);
}
$elasticaQuery
->setFrom(0)
->setSize(100)
->setSort(['find_date' => 'desc']);
// execute the query
$elasticaQuery->setQuery($query);
因为特别是在新版本中对过滤器进行了描述,我已经用这种方式重写了逻辑:
<?php
// Create the actual search query
$elasticaQuery = new Elastica\Query();
// create the multimatch
$query = new Elastica\Query\MultiMatch();
$query->setQuery($queryParam);
$query->setFields(array('title^12', 'description', 'company_name'));
$query->setType("cross_fields");
$query->setOperator("and");
//create bool query object
$elasticaFilterBool = new Elastica\Query\BoolQuery();
// check for filter
if(!is_null($type_id)){
$filter1 = new Elastica\Query\Term(array('job_type_id' => (int)$type_id));
$elasticaFilterBool->addMust($filter1);
}
// add the filter to the queryObject
$elasticaFilterBool->addMust($query);
$elasticaQuery
->setFrom(0)
->setSize(10)
->setSort(['find_date' => 'desc']);
$elasticaQuery->setQuery($elasticaFilterBool);
我在两个例子中都得到了相同的结果。
这是正确的方法吗?这意味着从这一点开始BoolQuery()包含所有过滤器和MatchAll()查询?