【问题标题】:Indexing calculated field with elastic search (FOSElasticaBundle) on symfony2在 symfony2 上使用弹性搜索(FOSElasticaBundle)索引计算字段
【发布时间】:2014-05-14 15:58:23
【问题描述】:

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

【问题讨论】:

  • 您能在 config.yml 中提供您当前的映射吗?我们还需要知道您的实体的结构(至少是第一类)
  • 谢谢;现在,您希望将您的费率实体的哪些字段编入索引?我需要实体映射(只是结构)
  • 我想索引与文章相关的“率”值的平均值

标签: symfony elasticsearch foselasticabundle


【解决方案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,并更新索引

【讨论】:

    【解决方案2】:

    您需要更新相关对象(速率实体)的索引映射,如下所示

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

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

    【讨论】:

    • 好的,谢谢,我有两个问题:为什么要放置 id 属性?在那之后,我怎样才能获得文章所有评分值的平均值?
    • 它是可选的(我这样做是因为它们是基于 ID 相关的,并且您的查询搜索结果将是实体对象;另一方面,您可以进行反向搜索;我的意思是按 ID 值搜索并获取相关文章。同样它是可选的)要获得平均值,您可以将逻辑应用于搜索结果,或者您可以创建一个自定义分析器来为您构建此逻辑
    • 我必须在我的过滤器表单中添加平均值,并在我的查询中过滤该值,我该怎么做,使用自定义分析器?
    • @user3328275 我不确定,但是当您通过 Elastica 创建过滤器时,您也许可以在 Elastica CustomFilterScore api (elastica.io/api/classes/…) 上注入您的逻辑库
    猜你喜欢
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 2012-05-07
    • 2014-03-21
    • 1970-01-01
    相关资源
    最近更新 更多