一尘不染

FOSElasticaBundle CustomScore查询分页

elasticsearch

我刚刚开始使用FOSElasticaBundle,到目前为止发现它确实非常好用。我不确定这是我对软件包/
Elastica的无知还是我对ElasticSearch的总体了解不足,但是是否可以通过分页进行CustomScore查询?

如果我尝试在CustomQuery对象上调用setFrom /
setSize,则会被告知该方法不存在。如果我创建一个Query对象并在其中设置setFrom和size并将该查询传递到CustomScore查询对象中,则将忽略分页参数。我已经包含了我的代码的一份副本,以说明它的价值。

        $queryString = new QueryString();
        $queryString->setFields(array('_all'))
            ->setDefaultOperator('OR')
            ->setQuery($terms);

        $query = new \Elastica\Query();
        $query->setQuery($queryString);
        $query->setSize($maxItems);
        $query->setFrom(($page - 1) * $maxItems);

        $custScoreQuery = new CustomScore();
        $custScoreQuery->setQuery($query);
        $custScoreQuery->setScript("_score * (doc['section.id'] == 7) ? 0.5 : 1");
        $index   = $this->get('fos_elastica.index.search_en_gb');
        $results = $index->search($custScoreQuery);

任何帮助都乐意接受:o)


阅读 286

收藏
2020-06-22

共1个答案

一尘不染

“大小”和“自”必须应用于顶级查询,在这里您将丢失它们。

试试这个:

$queryString = new QueryString();
$queryString->setFields(array('_all'))
        ->setDefaultOperator('OR')
        ->setQuery($terms);

$custScoreQuery = new CustomScore();
$custScoreQuery->setQuery($queryString);
$custScoreQuery->setScript("_score * (doc['section.id'] == 7) ? 0.5 : 1");

$query = new \Elastica\Query();
$query->setQuery($custScoreQuery);
$query->setSize($maxItems);
$query->setFrom(($page - 1) * $maxItems);

$index   = $this->get('fos_elastica.index.search_en_gb');
$results = $index->search($query);

另外,打开Elastica中的日志,您将能够查看Json查询中是否存在“大小”和“偏移”。话虽这么说,分页当然可以与自定义分数一起使用。

2020-06-22