1

在某个 ID 字段中,我们正在对文档进行索引,如下所示:1234 45676

我们希望能够对两组数字中的每一组进行全文搜索,就像它们是字符串一样。我在引号中转义数字组,mongo 文档说这将确保搜索整个字符串。

例如,如果索引字段中包含单词“blue”,则只会搜索单词“blue”。在“b”上搜索不会产生命中。(我们暂时使用非词干搜索)。

但这不是数字组的结果。即使我们用引号(“45676”)转义我们的数字组,数字组也会受到通配符搜索。在我们的示例中,搜索“4”将命中“45676”。

我们如何确保“45676”被视为只有在搜索“45676”时才会产生命中的字符串?

欢迎所有建议或观点!提前致谢。

4

1 回答 1

1

有两种解决方案可以将一组数字作为唯一的单词进行搜索。

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" }

请注意,输出不会返回 _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 });

更多信息:

于 2015-01-28T03:42:56.717 回答