【问题标题】:FOSElasticaBundle multiple nested queryFOSElasticaBundle 多重嵌套查询
【发布时间】:2014-02-19 12:58:25
【问题描述】:

我使用 FOSElasticaBundle 来处理搜索。当我有一层嵌套时,一切都很好。但是,当我有两个级别的嵌套结果应该匹配最里面的嵌套时,不会返回(例如,搜索“xx”类别会产生结果,但搜索“yy”品牌不会——而且应该)。

这是我的 fos_elastica 配置:

fos_elastica:
clients:
    default: { host: localhost, port: 9200 }
indexes:
    my_index:
        client: default
        types:
            product:
                mappings:
                    title: { boost: 1 }
                    articleNumber: ~
                    introductionDateSearch: { type: integer }
                    delistingDateSearch: { type: integer }
                    deleted: { type: boolean }
                    category:
                        type: "nested"
                        properties:
                            name: { boost: 1 }
                            brand:
                                type: "nested"
                                properties:
                                    name: { boost: 1 }
                persistence:
                    driver: orm
                    model: MyBundle\Entity\Product
                    provider: ~
                    finder: ~
                    listener: ~

还有我的查询处理程序:

public function searchForKeyword($keyword, AbstractUser $user)
{
    $this->setFilters($user);
    $keyword = trim($keyword);

    if ($keyword !== '') {
        $mainQuery = new \Elastica\Query\Bool();
        $mainProductQuery = new \Elastica\Query\Bool();

        //searching in Product title
        $productQuery = new \Elastica\Query\Text();
        $productQuery->setFieldQuery('title', $keyword);
        $productQuery->setFieldParam('title', 'boost', 5);
        $productQuery->setFieldParam('title', 'type', 'phrase_prefix');

        //searching in Product articleNumber
        $articleNumberQuery = new \Elastica\Query\Text();
        $articleNumberQuery->setFieldQuery('articleNumber', $keyword);
        $articleNumberQuery->setFieldParam('articleNumber', 'boost', 5);
        $articleNumberQuery->setFieldParam('articleNumber', 'type', 'phrase_prefix');

        //searching in Category name
        $categoryQuery = new \Elastica\Query\Text();
        $categoryQuery->setFieldQuery('name', $keyword);
        $categoryQuery->setFieldParam('name', 'boost', 3);
        $categoryQuery->setFieldParam('name', 'type', 'phrase_prefix');

        $nestedCategoryProductQuery = new \Elastica\Query\Nested();
        $nestedCategoryProductQuery->setPath('category');
        $nestedCategoryProductQuery->setQuery($categoryQuery);

        //searching in Brand name
        $brandQuery = new \Elastica\Query\Text();
        $brandQuery->setFieldQuery('name', $keyword);
        $brandQuery->setFieldParam('name', 'boost', 3);
        $brandQuery->setFieldParam('name', 'type', 'phrase_prefix');

        $nestedBrandCategoryQuery = new \Elastica\Query\Nested();
        $nestedBrandCategoryQuery->setPath('category.brand');
        $nestedBrandCategoryQuery->setQuery($brandQuery);

        $mainProductQuery->addShould($productQuery);
        $mainProductQuery->addShould($articleNumberQuery);
        $mainProductQuery->addShould($nestedCategoryProductQuery);
        $mainProductQuery->addShould($nestedBrandCategoryQuery);

        $mainQuery->addMust($mainProductQuery);

        $esFilteredQuery = new \Elastica\Query\Filtered($mainQuery, $this->filters);

    } else {
        $esFilteredQuery = new \Elastica\Query\Filtered(new \Elastica\Query\MatchAll(), $this->filters);
    }

    $this->query = new \Elastica\Query();
    $this->query->setQuery($esFilteredQuery);
}

$nestedBrandCategoryQuery 是如何添加到$mainProductQuery 中的?

感谢您的帮助! gtb

【问题讨论】:

  • 你的问题有什么运气吗?我将面临同样的问题,我想知道您是否设法找到解决方案。
  • 我不认为这是您遇到问题的原因,但我认为 \Elastica\Query\Text() 已贬值,您应该改用 \Elastica\Query\Match() 。
  • 感谢您的回复。我可以尝试使用 Match() 而不是 Text(),但我认为这不会解决问题(因为 FOSElasticaBundle“据说”支持多重嵌套)。也许我什至会尝试更新这个捆绑包......@CédricNirousset 我还没有找到解决方案。

标签: symfony elasticsearch


【解决方案1】:

FOSElasticaBundle 使用 Elastica 库。所以这不应该是 FOSElasticaBundle 的问题。

查看http://elastica.io/ 了解有关 Lib 的更多详细信息。以我的经验,如果 Elastica 受 Elasticsearch 支持,那么您就没有什么不能做的。即使 Elastica 中没有 Mapper,也只需使用原始数组查询 (http://elastica.io/example/raw-array-query.html) 来构建所需的查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多