【问题标题】:How to search on dynamic field and sort best match result first in MongoDB如何在 MongoDB 中搜索动态字段并首先对最佳匹配结果进行排序
【发布时间】:2021-12-09 15:43:09
【问题描述】:

我有多个文档,需要在排序字段名称未知时对文档进行排序,如果输入搜索字段与文档中的任何一个匹配,则对文档进行排序,并根据最佳结果进行排序。并且搜索输入也不是确切的名称,它可能是正则表达式 样本数据:

[
   {
      "cat_id":1,
      "categoryCode":"categoryCode1",
      "categoryName":"categoryName1",
      "cat_type":"A",
      "description":"Mens Upper Shirt"
   },
   {
      "cat_id":2,
      "categoryCode":"categoryCode2",
      "categoryName":"categoryName2",
      "cat_type":"A",
      "description":"Shirt"
   },
   {
      "cat_id":3,
      "categoryCode":"categoryCode3",
      "categoryName":"categoryName3",
      "cat_type":"Women Top wear",
      "description":"cloths"
   },
   {
      "cat_id":4,
      "categoryCode":"categoryCode4",
      "categoryName":"categoryName4",
      "cat_type":"A",
      "description":"Women"
   }
]

如果 search='Shirt' 那么响应是:

[
   {
      "cat_id":2,
      "categoryCode":"categoryCode2",
      "categoryName":"categoryName2",
      "cat_type":"A",
      "description":"Shirt"
   },
   {
      "cat_id":1,
      "categoryCode":"categoryCode1",
      "categoryName":"categoryName1",
      "cat_type":"A",
      "description":"Mens Upper Shirt"
   }
]

如果 search='Women Top Wear' 那么响应是:

[
   {
      "cat_id":3,
      "categoryCode":"categoryCode3",
      "categoryName":"categoryName3",
      "cat_type":"Women Top wear",
      "description":"cloths"
   },
   {
      "cat_id":4,
      "categoryCode":"categoryCode4",
      "categoryName":"categoryName4",
      "cat_type":"A",
      "description":"Women"
   }
]

当您必须搜索的任何输入时,它将检查该值是否存在于所有 5 个属性中(如果存在),然后返回该文档并按最佳匹配排序

【问题讨论】:

    标签: mongodb mongoose mongodb-query aggregation-framework spring-data-mongodb


    【解决方案1】:

    您为此使用了错误的数据库,Mongo 不是搜索引擎,因此将其用于这些需求总是有其局限性。我建议您考虑更合适的解决方案,例如 elasticsearchmongo atlas search

    为此使用 Mongo 的最大问题是您的要求:

    按最佳匹配排序

    最佳匹配的确切定义是什么?我建议的搜索引擎对这些事情有一个内置的评分机制。但是如果我们要在 Mongo 中进行,则必须自己定义逻辑,这基本上等同于为数据库构建完整的评分方法(如果您希望它稳定且成功,这不是简单的任务)。

    我不会费心为此添加 puesdo 代码,因为我建议不要这样做,但正如您提到的,您基本上必须进行正则表达式搜索。一旦你匹配了文档,那么只剩下分数计算基于你想要定义的排序“最佳”匹配的逻辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多