在MongoDB中使用索引进行部分文本搜索

时间:2019-01-09 05:45:00

标签: node.js mongodb indexing mongoose partial

我有一个Contacts集合,其中包含字段,姓名,电子邮件和手机号码,其中包含大约200万条记录(在一段时间内可能达到1000万条)。我想在使用索引时使用$regex对名称和电子邮件字段进行不区分大小写的搜索。

我在名称和电子邮件字段上都创建了文本索引,但是在这种情况下部分搜索无法正常工作。此外,我还尝试了在名称和电子邮件字段上使用索引,并使用了不区分大小写选项的运算符$regex,但在这种情况下,两个字段上均未应用索引。

这是我已经尝试过的:

尝试过{'$text': { $search: searchstring }} 结果:无法搜索部分文本

尝试过{'name': { $regex: 'searchstring', $options: 'i' }} 尝试过{'email': { $regex: 'searchstring', $options: 'i' }} 结果:能够搜索部分文本但不使用索引,因此搜索非常慢,无法达到目的

因此,基本上我需要在MongoDB中实现的功能类似于SQL Server中具有1的通配符功能(%)。非常快的搜索速度(拆分秒)2.能够进行部分搜索。

有关SQL Server的示例应如下所示

select * from tblUsers where username like '%amit%'

我们在后端使用NodeJS,在前端使用React。

以下是索引: [    {        “ v”:2        “密钥”:{            “ _id”:1        },        “ name”:“ id ”,        “ ns”:“联系人”    },    {        “ v”:2        “密钥”:{            “ companyId”:1.0,            “ isDeleted”:1.0,            “ _id”:1.0,            “列表”:1.0        },        “ name”:“ contacts_cmpId_isdel_id_lists”,        “ ns”:“联系人”,        “背景”:真实    },    {        “ v”:2        “密钥”:{            “ companyId”:1.0,            “ isDeleted”:1.0,            “ _fts”:“文字”,            “ _ftsx”:1        },        “ name”:“ contacts_cmpId_nm_em_mb_unq”,        “ ns”:“联系人”,        “背景”:是的,        “重量”:{            “ emailAddress”:1,            “移动”:1            “名称”:1            “ uniqueId”:1        },        “ default_language”:“英语”,        “ language_override”:“ language”,        “ textIndexVersion”:3    },    {        “ v”:2        “密钥”:{            “ companyId”:1.0,            “ isDeleted”:1.0,            “ emailAddress”:1.0        },        “ name”:“ companyId_1_isDeleted_1_emailAddress_1”,        “ ns”:“联系人”,        “排序规则”:{            “ locale”:“ en”,            “ caseLevel”:false,            “ caseFirst”:“ off”,            “力量”:2            “ numericOrdering”:false,            “ alternate”:“ non-ignorable”,            “ maxVariable”:“ punct”,            “规范化”:false,            “向后”:false,            “ version”:“ 57.1”        }    },    {        “ v”:2        “密钥”:{            “ companyId”:1            “已删除”:1,            “名称”:1            “列表”:1            “ createdDate”:1        },        “ name”:“ contacts_cmpId_isdel_name_lists_crdt”,        “ ns”:“联系人”,        “背景”:真实    } ]

这是解释查询

db.getCollection('contacts').find({companyId: ObjectId('5bfcd53c19ebe6727a000d90'), isDeleted: false, 'name': { $regex: 'test1User', $options: 'i' }}).skip(0).limit(100).explain('executionStats')

及其输出:

“ executionStats”:{        “ executionSuccess”:是的,        “ nReturned”:1        “ executionTimeMillis”:3634,        “ totalKeysExamined”:613865,        “ totalDocsExamined”:613840,}

1 个答案:

答案 0 :(得分:0)

我假设您正在使用猫鼬,因为标签中已提及猫鼬。 如果是这样,您可以像这样使用正则表达式

UserModel.find({name:new RegExp(nameVariable,"i")}); //"i" makes it case sensitive 

尝试它应该可以解决问题