【问题标题】:MongoDB substring product search order by highest matchMongoDB子字符串产品搜索顺序最高匹配
【发布时间】:2015-11-12 17:08:50
【问题描述】:

我在 Mongodb 中不太好。这是我第一个使用它的项目。我正在开发某种商店网站。我们正在为 mongodb 使用 C# 和最新的 C# 驱动程序。我需要一个想法如何实现我的算法来根据用户的输入过滤产品。这是我的算法的工作原理/应该工作原理。

  1. 用户输入类似“蓝色阿迪达斯男式蜘蛛侠棉质 T 恤”的内容
  2. 我将整个短语分成单个单词,因此我有“blue”、“adidas”、“men”、“spiderman”、“cotton”、“t-shirt”
  3. 我根据我的数据库中的零售商、颜色、类别名称检查每个单词。所以这是怎么回事。

    • “蓝色” - 哦,这是一个颜色过滤器,让我们根据我的 mongodb 文档中的适当字段过滤它。
    • “adidas” - 好的,它是零售商。执行与上述相同的操作
    • “男人” - 这是一个类别。好的,让我们只在这个类别中搜索。
    • “棉花” - 我不按纺织品过滤。无法按此过滤。
    • “蜘蛛侠” - 绝对不是零售商,颜色等。无法使用此过滤。
    • “T 恤” - 好的。它是作为儿童、男性、女性的子类别出现的类别名称,但由于我已经将“男性”作为我的类别,所以我只是更深入地了解我的类别结构 - 现在我更新了我想要过滤的 categoryId,它不是- 男士类别下的衬衫类别。

      1. 好的。我从用户输入中解析了几个过滤器参数,但我仍然有棉花和蜘蛛侠词。这就是我迷路的地方。

我不想忽略这个“蜘蛛侠”和“棉花”两个词。我想通过产品名称中的单词覆盖率实际从数据库订单中获取所有项目,所以我的预期结果(首先应用所有零售商、颜色等过滤器的 ofc)是:

名称中同时包含“蜘蛛侠”和“棉花”产品的产品 名称中包含“蜘蛛侠”或“棉花”的产品

我该怎么做?

【问题讨论】:

    标签: c# mongodb mongodb-.net-driver


    【解决方案1】:

    首先,您可以像这样使用& operator 组合多个过滤器:

    var builder = Builders<Product>.Filter;
    FilterDefinition<Product> filter = builder.Empty;
    filter &= builder.Eq("Color", "blue");
    filter &= builder.Eq("Retailer", "adidas");
    filter &= builder.Eq("Category", "men");
    

    然后,您可以使用Regex 过滤名称中包含任何剩余词/所有剩余词的产品。
    OR 搜索(名称中包含“棉花”或“蜘蛛侠”)

    var restWords = new string[] { "cotton", "spiderman" };
    var orReg = new System.Text.RegularExpressions.Regex(string.Join("|", restWords));
    filter &= builder.Regex("Name", BsonRegularExpression.Create(orReg));
    
    List<Product> filteredList = products.Find(filter).ToListAsync().Result;
    

    AND搜索(名称中包含“棉花”和“蜘蛛侠”)

    foreach (var word in restWords)
    {
        filter &= builder.Regex("Name", BsonRegularExpression.Create(new System.Text.RegularExpressions.Regex(word)));
    }
    
    List<Product> filteredList = products.Find(filter).ToListAsync().Result;
    

    【讨论】:

    • 嘿jhmt。谢谢你的回复。我完全按照您解释的方式解决了它,但是我想以这种方式实现它,即 mongo 返回我的结果,该结果按产品名称中与查询匹配的单词数排序。在上面的示例中,我只有 2 个单词,但我希望它能够在更复杂的情况下工作,例如对于 5 个单词的查询结果将是: - 产品名称中的所有 5 个单词 - 产品名称中的 4 个单词 - 产品名称中的 3 个单词等等
    • @Rafal 你的意思是,当搜索词是 ("blue", "adidas", "men", "spiderman", "cotton", "t-shirt"), 1st ("蜘蛛侠棉质 T 恤"),第二件(“蜘蛛侠棉短裤”),第三件(“蜘蛛侠袜子”)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    相关资源
    最近更新 更多