如何在Symfony中通过FOSElasticaBundle获取Elasticsearch的_score?
在Symfony中通过FOSElasticaBundle获取Elasticsearch的
_score字段 别担心,完全可以做到!用FOSElasticaBundle获取Elasticsearch返回的_score字段其实很简单,我给你两种实用的方式:
1. 直接从Elastica结果对象获取
当你用$finder->find()执行查询后,返回的是Elastica\Result对象的集合,每个Result对象都自带了获取评分的方法。结合你给出的查询代码,只需要在查询后遍历结果即可:
$finder = $this->container->get('fos_elastica.finder.app.article'); $boolQuery = new \Elastica\Query\BoolQuery(); $fieldQuery = new \Elastica\Query\Match(); $fieldQuery->setFieldQuery('title', 'I am a title string'); $fieldQuery->setFieldParam('title', 'analyzer', 'my_analyzer'); $boolQuery->addShould($fieldQuery); // 执行查询 $results = $finder->find($boolQuery); foreach ($results as $result) { // 获取_score字段值 $score = $result->getScore(); // 如果需要获取映射的实体对象 $article = $result->getTransformed(); // 这里就可以使用$score啦 echo "文章评分:{$score}"; }
2. 将_score映射到实体类属性
如果你希望直接把评分绑定到你的Article实体对象上,可以通过配置FOSElasticaBundle的映射来实现:
第一步:在实体类中添加score属性
// src/Entity/Article.php namespace App\Entity; class Article { // 你的其他实体属性和方法... private ?float $score = null; public function getScore(): ?float { return $this->score; } public function setScore(?float $score): self { $this->score = $score; return $this; } }
第二步:配置FOSElasticaBundle的映射
在你的Elasticsearch配置文件(比如config/packages/fos_elastica.yaml)中,给article类型添加_score字段的映射:
fos_elastica: indexes: app: types: article: mappings: title: ~ # 其他字段的映射配置... _score: type: float enabled: true persistence: driver: orm model: App\Entity\Article provider: ~ finder: ~
配置完成后,当你调用$result->getTransformed()获取实体对象时,$article->getScore()就能直接拿到_score的值了。
内容的提问来源于stack exchange,提问作者Rob Bauer
相关产品推荐
相关产品推荐

