我在Symfony应用中遇到Elastica QueryBuilder精确搜索问题。 Elastica版本是2.1,它取决于Elasticsearch 1.5.2。我正在搜索其中一个字段被映射为
的索引majors:
type: string
index : not_analyzed
该领域是学生的专业,可以有一个或多个单词,例如"古代历史"。
查询设置如下:
/** @var ElasticaFactory $ef */
protected $ef;
public function __construct(ElasticaFactory $ef)
{
$this->ef = $ef;
}
$query = $this->ef->createQuery();
$qb = $this->ef->createQueryBuilder();
$bool = $qb->filter()->bool();
$query->setQuery(
$qb->query()->filtered(
$qb->query()->term(),
$bool->addShould(
$qb->filter()->term(
array('majors' => $params['majors'])
)
)
)
);
当我运行此查询时,我收到SearchPhaseExecutionException错误。错误消息的全文是here。 堆栈跟踪显示请求的完整内容:
Client ->request ('students/_search', 'GET', array('query' => array('filtered' => array('query' => array('term' => array()), 'filter' => array('bool' => array('should' => array(array('term' => array('majors' => 'Ancient Studies')))))))), array('from' => '0', 'size' => '10'))
in /vagrant/persona/vendor/ruflin/elastica/lib/Elastica/Search.php at line 455
当我将查询设置为"匹配"下面,它没有错误:
$query->setQuery(
$qb->query()->filtered(
$qb->query()->match('majors', $params['majors']),
$bool
)
);
但是,匹配查询会返回太多不相关的结果。我需要一个精确的搜索查询。
接下来,为了消除Elastica的任何问题,我将查询转换为原始ES查询,如下所示:
$query->setRawQuery(
array(
'query' => array(
'filtered' => array(
'query' => array(
'term' => array()),
'filter' => array(
'bool' => array(
'should' => array(
array(
'term' => array(
'majors' => 'Art History'
)
)
)
)
)
)
)
)
);
这给了我与上面引用的相同的错误消息。看起来查询本身存在问题,而不是Elastica。 当我重新排列查询以完全遵循下面的 documentation时,即使匹配的记录存在,也没有返回任何结果
$query->setRawQuery(
array(
'query' => array(
'filtered' => array(
'filter' => array(
'term' => array(
'majors' => 'Art History'
)
)
)
)
)
);
任何帮助将不胜感激!