首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FOSElasticaBundle多嵌套查询

FOSElasticaBundle多嵌套查询
EN

Stack Overflow用户
提问于 2014-01-28 17:46:33
回答 1查看 2.8K关注 0票数 6

我使用FOSElasticaBundle来处理搜索。当我有一个级别的嵌套时,所有的工作都很好。然而,当我有两个级别的嵌套时,应该与最里面的嵌套匹配的结果不会返回(例如,搜索“xx”类别确实会产生结果,但搜索“yy”品牌不会-也应该)。

下面是我的fos_elastica配置:

代码语言:javascript
复制
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: ~

和我的查询处理程序:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2015-03-17 16:50:38

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

有关Lib的更多详细信息,请查看http://elastica.io/。根据我的经验,如果Elasticsearch支持Elastica,那么没有什么不能使用Elastica的。即使在Elastica中没有映射器,也只需使用原始数组查询(http://elastica.io/example/raw-array-query.html)来构建所需的查询。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21402019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档