如何在 MongoDB 中搜索动态字段并首先对最佳匹配结果进行排序

Posted

技术标签:

【中文标题】如何在 MongoDB 中搜索动态字段并首先对最佳匹配结果进行排序【英文标题】:How to search on dynamic field and sort best match result first in 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 个属性中(如果存在),然后返回该文档并按最佳匹配排序

【问题讨论】:

【参考方案1】:

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

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

按最佳匹配排序

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

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

【讨论】:

以上是关于如何在 MongoDB 中搜索动态字段并首先对最佳匹配结果进行排序的主要内容,如果未能解决你的问题,请参考以下文章

在 elasticsearch 中定义动态映射索引字段的最佳方法

如何在不指定字段名称的情况下使用 mongodb 在 nodejs 中进行部分数据搜索? [复制]

MongoDB PyMongo - 创建索引并在两个字段中进行不区分大小写的搜索

如何在节点 js 和 mongodb 中使用填充的字段键值名称进行搜索?

使用多个字段在 MongoDB 聚合框架中按相关性排序

使用多个字段在 MongoDB 聚合框架中按相关性排序