使用Elastica QueryBuilder进行精确搜索查询

时间:2017-12-27 22:06:21

标签: php symfony elasticsearch elastica

我在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'
                            )
                        )
                    )
                )
            )
        );

任何帮助将不胜感激!

0 个答案:

没有答案