在symfony2上使用弹性搜索(FOSElasticaBundle)索引计算字段

时间:2014-05-14 15:58:24

标签: symfony elasticsearch foselasticabundle

我有一个“文章”实体,与实体“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;

2 个答案:

答案 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: ~

现在它将索引文章和与文章相关的值(如果没有为文章设置值,它将索引文章但没有值)