gpt4 book ai didi

symfony - FOSElasticaBundle 多重嵌套查询

转载 作者:行者123 更新时间:2023-11-29 02:48:47 24 4
gpt4 key购买 nike

我使用 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 中的?

感谢您的帮助!

最佳答案

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

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

关于symfony - FOSElasticaBundle 多重嵌套查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21402019/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com