我有一个“文章”实体,与实体“rate”有一对多的关系。
我的文章已编入索引。我想添加索引文章的平均费率(使用与文章相关的“费率”实体计算),我不知道如何做到这一点,如果新的费率是新的费率,还必须更新平均费率创建
用于config.yml中的映射:
indexes:
piy:
client: default
settings:
index:
analysis:
analyzer:
custom_search_analyzer:
type: custom
tokenizer: standard
filter : [standard, lowercase, asciifolding]
custom_index_analyzer:
type: custom
tokenizer: standard
filter : [standard, lowercase, asciifolding, custom_filter]
filter:
custom_filter:
type: edgeNGram
side: front
min_gram: 1
max_gram: 20
types:
article:
mappings:
title : { search_analyzer: custom_search_analyzer, index_analyzer: custom_index_analyzer, type: string }
user:
type : object
properties :
fullName : { search_analyzer: custom_search_analyzer, index_analyzer: custom_index_analyzer, type: string }
persistence:
driver: orm
model: Piy\CoreBundle\Entity\Article
elastica_to_model_transformer:
service: piy.transformers.elastica.article
finder: ~
provider: ~
listener: ~
和费率实体映射:
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="integer", length=1)
*/
private $value;
/**
* @ORM\ManyToOne(targetEntity="Piy\CoreBundle\Entity\User", inversedBy="articleRates")
*/
public $user;
/**
* @ORM\ManyToOne(targetEntity="Piy\CoreBundle\Entity\Article", inversedBy="rates")
*/
private $article;
答案 0 :(得分:1)
通过添加过滤器脚本,我找到了一种方法:
$rateFilter = new \Elastica\Filter\Script("sum=0; foreach( rate : doc['value'].values) { sum = sum + rate }; avg = sum/doc['value'].values.length; avg >= ".$searchRate."; ");
但现在我还有另一个问题:当我在文章上添加新费率时,它不会添加到索引中...
编辑: 要在添加或更新费率时更新文章父级,我已在postPersist和postUpdate上添加了一个监听器,用于启动文章的postUpdate,并更新索引
答案 1 :(得分:0)
您需要更新相关对象(费率实体)的索引映射,如下所示
...
types:
article:
mappings:
title : { search_analyzer: custom_search_analyzer, index_analyzer: custom_index_analyzer, type: string }
user:
type : object
properties :
fullName : { search_analyzer: custom_search_analyzer, index_analyzer: custom_index_analyzer, type: string }
rates:
type : object
properties :
id : ~
value: ~
现在它将索引文章和与文章相关的值(如果没有为文章设置值,它将索引文章但没有值)