Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex MongoDB搜索和排序,包括匹配数和精确匹配数_Regex_Mongodb_Sorting_Mongodb Query_Aggregation Framework - Fatal编程技术网

Regex MongoDB搜索和排序,包括匹配数和精确匹配数

Regex MongoDB搜索和排序,包括匹配数和精确匹配数,regex,mongodb,sorting,mongodb-query,aggregation-framework,Regex,Mongodb,Sorting,Mongodb Query,Aggregation Framework,我想创建一个小的MongoDB搜索查询,在这个查询中,我想根据精确匹配和匹配数对结果集进行排序 如果我有以下标签 Physics 11th-Physics JEE-IIT-Physics Physics-Physics 那么,如果我搜索“物理学”,它应该排序为 Physics Physics-Physics 11th-Physics JEE-IIT-Physics 寻找你在这里谈论的那种“得分”是一种“不完美解决方案”的练习。在这种情况下,“最佳匹配”开始于“文本搜索”,而“不完美”则是在使

我想创建一个小的MongoDB搜索查询,在这个查询中,我想根据精确匹配和匹配数对结果集进行排序

如果我有以下标签

Physics
11th-Physics
JEE-IIT-Physics
Physics-Physics
那么,如果我搜索“物理学”,它应该排序为

Physics
Physics-Physics
11th-Physics
JEE-IIT-Physics
寻找你在这里谈论的那种“得分”是一种“不完美解决方案”的练习。在这种情况下,“最佳匹配”开始于“文本搜索”,而“不完美”则是在使用MunGDB的文本搜索能力时首先考虑的术语。 MongoDB“不是”一个专用的“文本搜索”产品,也不是(像大多数数据库一样)试图成为一个。“文本搜索”的全部功能是为专门的产品保留的,这些产品可以在专业领域内进行搜索。因此,也许不是最合适的,但是“文本搜索”是为那些能够忍受这些限制并且不想实现另一个引擎的人提供的一种选择。还是现在!至少

话虽如此,让我们看看你能对给定的数据样本做些什么。首先在集合中设置一些数据:

db.junk.insert([
{“数据”:“物理”},
{“数据”:“第11届物理学”},
{“数据”:“吉特物理”},
{“数据”:“物理”},
{“数据”:“不相关的东西”}
])
当然,要“启用”文本搜索功能,则需要使用“文本”索引类型索引文档中的至少一个字段:

db.junk.createIndex({“数据”:“文本”})
现在是“准备就绪”,让我们看一看第一个基本查询:

db.junk.find(
{“$text”:{“$search”:“\“Physics\”},
{“分数”:{“$meta”:“文本分数”}
).sort({“score”:{“$meta”:“textScore”})
这将产生如下结果:

{
“_id”:ObjectId(“55af83b964876554be823f33”),
“数据”:“物理”,
“分数”:1.5分
}
{
“_id”:ObjectId(“55af83b964876554be823f30”),
“数据”:“物理”,
“分数”:1分
}
{
“_id”:ObjectId(“55af83b964876554be823f31”),
“数据”:“第11届物理学”,
“分数”:0.75
}
{
“_id”:ObjectId(“55af83b964876554be823f32”),
“数据”:“吉特物理”,
“分数”:0.6666
}
因此,这与您期望的结果“接近”,但当然没有“精确匹配”组件。此外,这里的文本搜索功能与运算符使用的逻辑意味着“物理”是这里的首选匹配

这是因为then引擎无法识别“非单词”,例如中间的“连字符”。对它来说,“物理”一词在文档的索引内容中出现了好几次,因此它的分数较高

现在,这里剩下的逻辑取决于“精确匹配”的应用,以及你的意思。如果您要在字符串中查找“Physics”,并且“not”由“连字符”或其他字符包围,则以下情况不适用。但您可以匹配一个字段“值”,该字段“正好”只是“物理”:

db.junk.aggregate([
{“$match”:{
“$text”:{“$search”:“Physics”}
}},
{“$project”:{
“数据”:1,
“分数”:{
“$add”:[
{“$meta”:“textScore”},
{“$cond”:[
{“$eq”:[“$data”,“Physics”]},
10,
0
]}
]
}
}},
{“$sort”:{“score”:-1}
])
这将给你一个结果,既看引擎产生的“文本分数”,然后用逻辑测试应用一些数学。在这种情况下,如果“数据”与“物理”完全相等,则我们使用以下方法通过附加因子“加权”分数:

{
“_id”:ObjectId(“55af83b964876554be823f30”),
“数据”:“物理”,
“分数”:11分
}
{
“_id”:ObjectId(“55af83b964876554be823f33”),
“数据”:“物理”,
“分数”:1.5分
}
{
“_id”:ObjectId(“55af83b964876554be823f31”),
“数据”:“第11届物理学”,
“分数”:0.75
}
{
“_id”:ObjectId(“55af83b964876554be823f32”),
“数据”:“吉特物理”,
“分数”:0.6666
}
这就是可以为您做的,通过允许使用附加条件操纵返回的数据。最终结果被传递到stage(注意它是按降序颠倒的),以允许将新值传递给排序键

但是聚合框架实际上只能处理字符串上的“精确匹配”。目前还没有处理正则表达式匹配或返回有意义的投影值的字符串中的索引位置的工具。连逻辑上的匹配都没有。并且该操作仅用于查询中的“筛选”,因此在这里没有用处

因此,如果您在“短语”中查找比“字符串等于”精确匹配更复杂的内容,那么另一个选项是使用

这是另一种“不完美”的方法,因为
mapReduce
命令的限制意味着引擎查询的“textScore”已经“完全消失”。虽然将正确选择实际文档,但引擎无法使用固有的“排名数据”。这是MongoDB首先将“分数”投影到文档中的副产品,“投影”不是
mapReduce
可用的功能

但您可以使用JavaScript“玩”字符串,如我的“不完美”示例:

db.junk.mapReduce(
函数(){
var _id=这个。_id,
得分=0;
删除此项。\u id;
分数+=此.data.indexOf(搜索);
score+=this.data.lastIndexOf(搜索);
发出({“score”:score,id:{u id},this);
},
函数(){},
{ 
“out”:{“inline”:1},
“查询”:{“$text”:{“$search”:“Physics”},
“范围”:{“搜索”:“物理”}
}
)
结果如下:

{
“_id”:{
“分数”:0,
“id”:O
db.junk.insert([
  { "data": "Physics" },
  { "data": "11th-Physics" },
  { "data": "JEE-IIT-Physics" },
  { "data": "Physics-Physics" },
  { "data": "Something Unrelated" }
])
const data = "Physics";

db.junk.aggregate([
  { "$match": { "data": { "$regex": data, "$options": "i" }}},
  { "$addFields": { "score": { "$indexOfCP": [{ "$toLower": "$data" }, { "$toLower": data }]}}},
  { "$sort": { "score": 1 }}
])
[
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "data": "Physics",
    "score": 0
  },
  {
    "_id": ObjectId("5a934e000102030405000003"),
    "data": "Physics-Physics",
    "score": 0
  },
  {
    "_id": ObjectId("5a934e000102030405000001"),
    "data": "11th-Physics",
    "score": 5
  },
  {
    "_id": ObjectId("5a934e000102030405000002"),
    "data": "JEE-IIT-Physics",
    "score": 8
  }
]