2014-05-14 42 views
2

我有一個「物品」實體,它與實體「rate」具有一對多關係。在symfony2上使用彈性搜索(FOSElasticaBundle)對計算字段進行索引

我的文章已經編入索引。我想添加索引文章的費率平均值(用與文章相關的「費率」實體計算),並且我不知道如何做到這一點,如果新費率是創建。

在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

您可以在config.yml中提供您當前的映射嗎?此外,我們需要知道您的實體的結構(至少比率) – Javad

+0

謝謝;現在,您想要對您的費率實體的哪些字段進行索引?我需要實體映射(只是結構) – Javad

+0

我想索引與文章 – user3328275

回答

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

現在,它將索引文章和與文章相關的值(如果n O值設置爲文章它會指數的文章,但沒有值)

+0

相關的「速率」值的平均值。謝謝,我有2個問題:爲什麼要放置id屬性?在那之後,我如何得到文章的所有費率值的平均值? – user3328275

+0

它是可選的(我這樣做是因爲它們基於ID進行相關,並且查詢搜索的結果將是實體對象;另一方面,您可以進行反向搜索;我的意思是通過Id值進行搜索並獲取相關文章。它是可選的)爲了獲得平均值,您可以將邏輯應用於搜索結果,或者您可以創建一個自定義分析器,爲您建立此邏輯 – Javad

+0

我必須在我的過濾器表單中添加平均值,並在該值上過濾我的查詢,如何使用自定義分析器? – user3328275

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對於費率,啓動文章的更新後更新,並更新索引