gpt4 book ai didi

mongodb - 使用 MongoDB 进行构面搜索

转载 作者:IT老高 更新时间:2023-10-28 13:09:50 25 4
gpt4 key购买 nike

我正在考虑在我的下一个项目中使用 MongoDB。此应用程序的核心要求之一是提供分面搜索。有没有人尝试过使用 MongoDB 来实现构面搜索?

我有一个具有各种属性的产品模型,例如尺寸、颜色、品牌等。在搜索产品时,这个 Rails 应用程序应该在侧边栏显示构面过滤器。构面过滤器看起来像这样:

Size:
XXS (34)
XS (22)
S (23)
M (37)
L (19)
XL (29)

Color:
Black (32)
Blue (87)
Green (14)
Red (21)
White (43)

Brand:
Brand 1 (43)
Brand 2 (27)

最佳答案

我认为使用 Apache Solr 或 ElasticSearch 可以获得更多的灵 active 和性能,但使用 Aggregation Framework 支持这一点.

使用 MongoDB 的主要问题是您必须查询 N 次:首先获取匹配结果,然后每组一次;使用全文搜索引擎时,您可以在一个查询中获得所有信息。

示例

//'tags' filter simulates the search
//this query gets the products
db.products.find({tags: {$all: ["tag1", "tag2"]}})

//this query gets the size facet
db.products.aggregate(
{$match: {tags: {$all: ["tag1", "tag2"]}}},
{$group: {_id: "$size"}, count: {$sum:1}},
{$sort: {count:-1}}
)

//this query gets the color facet
db.products.aggregate(
{$match: {tags: {$all: ["tag1", "tag2"]}}},
{$group: {_id: "$color"}, count: {$sum:1}},
{$sort: {count:-1}}
)

//this query gets the brand facet
db.products.aggregate(
{$match: {tags: {$all: ["tag1", "tag2"]}}},
{$group: {_id: "$brand"}, count: {$sum:1}},
{$sort: {count:-1}}
)

一旦用户使用构面过滤搜索,您必须添加此过滤器来查询谓词和匹配谓词,如下所示。

//user clicks on "Brand 1" facet
db.products.find({tags: {$all: ["tag1", "tag2"]}, brand: "Brand 1"})

db.products.aggregate(
{$match: {tags: {$all: ["tag1", "tag2"]}}, brand: "Brand 1"},
{$group: {_id: "$size"}, count: {$sum:1}},
{$sort: {count:-1}}
)

db.products.aggregate(
{$match: {tags: {$all: ["tag1", "tag2"]}}, brand: "Brand 1"},
{$group: {_id: "$color"}, count: {$sum:1}},
{$sort: {count:-1}}
)

db.products.aggregate(
{$match: {tags: {$all: ["tag1", "tag2"]}}, brand: "Brand 1"},
{$group: {_id: "$brand"}, count: {$sum:1}},
{$sort: {count:-1}}
)

关于mongodb - 使用 MongoDB 进行构面搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12428989/

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