我们如何在 mongodb 全文搜索中将数字组视为字符串?
How can we treat groups of digits as strings in mongodb fulltext searches?
在某个 ID 字段中,我们正在对文档进行索引,如下所示:
1234 45676
我们希望能够对 2 组数字中的每一组进行全文搜索,就好像它们是字符串一样。我用引号转义了数字组,mongo 文档说这将确保搜索整个字符串。
例如,如果索引字段中包含单词 "blue",则只会搜索单词 "blue"。在 "b" 上搜索不会产生结果。 (我们暂时使用非词干搜索)。
但这不是数字组的结果。即使我们用引号(“45676”)转义我们的数字组,数字组也会受到通配符搜索。在我们的示例中,搜索“4”将找到“45676”。
我们如何确保“45676”被视为只有在搜索“45676”时才会产生命中的字符串?
欢迎所有建议或观点!提前致谢。
将一组数字作为唯一的单个词进行搜索有两种解决方案。
1) 使用 $text 运算符和文本索引
2) 使用 $regexp 运算符或正则表达式。
设置:
db = connect("test"); // same as `use test;`
db.a.drop();
db.a.insert([
{ _id: 1, txt : "Log 1: Page 23 1234 45676" },
{ _id: 2, txt : "Log 2: Page 45 0000 00000" },
{ _id: 3, txt : "Log 3: Page 59 1337 11111" }
]);
1。使用 $text 运算符
的示例
索引可搜索字段
db.a.ensureIndex({ txt : "text" });
使用 $text 运算符查询
db.a.find({ $text : { $search : "45" } });
输出
{ _id: 2, txt : "Log 2: Page 45 0000 00000" }
请注意输出没有 return _id 为 1 的文档,即使它包含 45676
.
2。使用正则表达式的示例
对于正则表达式,您需要将数字包裹在单词边界中,\b
,以避免它们在字符串中被匹配。
示例:
正在搜索没有单词边界的 4
。
/4/.test("4") == true
/4/.test("1234") == true
正在搜索带有单词边界的 4
。
/\b4\b/.test("4") == true
/\b4\b/.test("1234") == false
使用正则表达式搜索 45
db.a.find({ txt : /\b45\b/ });
输出
{ _id: 2, txt : "Log 2: Page 45 0000 00000" }
您可以使用以下函数根据用户输入形成正则表达式。
function escapeRegExp(str) {
return String(str).replace(/[[\]/{}()*+?.\^$|-]/g, "\$&");
}
function wordToRegExp( query ){
return new RegExp( "\b" + escapeRegExp( query ) + "\b" );
}
var queryForWord = wordToRegExp( 45 );
// queryForWord would be sent from your server side, not created in mongo shell.
db.a.find({ txt : queryForWord });
更多信息:
- $text doc
- $regex doc
- Regular Expressions Basics
- Fulltext search setup
在某个 ID 字段中,我们正在对文档进行索引,如下所示: 1234 45676
我们希望能够对 2 组数字中的每一组进行全文搜索,就好像它们是字符串一样。我用引号转义了数字组,mongo 文档说这将确保搜索整个字符串。
例如,如果索引字段中包含单词 "blue",则只会搜索单词 "blue"。在 "b" 上搜索不会产生结果。 (我们暂时使用非词干搜索)。
但这不是数字组的结果。即使我们用引号(“45676”)转义我们的数字组,数字组也会受到通配符搜索。在我们的示例中,搜索“4”将找到“45676”。
我们如何确保“45676”被视为只有在搜索“45676”时才会产生命中的字符串?
欢迎所有建议或观点!提前致谢。
将一组数字作为唯一的单个词进行搜索有两种解决方案。
1) 使用 $text 运算符和文本索引
2) 使用 $regexp 运算符或正则表达式。
设置:
db = connect("test"); // same as `use test;`
db.a.drop();
db.a.insert([
{ _id: 1, txt : "Log 1: Page 23 1234 45676" },
{ _id: 2, txt : "Log 2: Page 45 0000 00000" },
{ _id: 3, txt : "Log 3: Page 59 1337 11111" }
]);
1。使用 $text 运算符
的示例索引可搜索字段
db.a.ensureIndex({ txt : "text" });
使用 $text 运算符查询
db.a.find({ $text : { $search : "45" } });
输出
{ _id: 2, txt : "Log 2: Page 45 0000 00000" }
请注意输出没有 return _id 为 1 的文档,即使它包含 45676
.
2。使用正则表达式的示例
对于正则表达式,您需要将数字包裹在单词边界中,\b
,以避免它们在字符串中被匹配。
示例:
正在搜索没有单词边界的 4
。
/4/.test("4") == true
/4/.test("1234") == true
正在搜索带有单词边界的 4
。
/\b4\b/.test("4") == true
/\b4\b/.test("1234") == false
使用正则表达式搜索 45
db.a.find({ txt : /\b45\b/ });
输出
{ _id: 2, txt : "Log 2: Page 45 0000 00000" }
您可以使用以下函数根据用户输入形成正则表达式。
function escapeRegExp(str) {
return String(str).replace(/[[\]/{}()*+?.\^$|-]/g, "\$&");
}
function wordToRegExp( query ){
return new RegExp( "\b" + escapeRegExp( query ) + "\b" );
}
var queryForWord = wordToRegExp( 45 );
// queryForWord would be sent from your server side, not created in mongo shell.
db.a.find({ txt : queryForWord });
更多信息:
- $text doc
- $regex doc
- Regular Expressions Basics
- Fulltext search setup