如何在 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 - 创建索引并在两个字段中进行不区分大小写的搜索