1

我的应用程序正在尝试将传入字符串与我的 Mongo 数据库中的文档进行匹配,其中字段具有关键字列表。目标是查看关键字是否存在于字符串中。

这是一个例子:

传入字符串:

"John Doe is from Florida and is a fan of American Express"

MongoDB 中文档的字段具有如下值:

in_words: "georgia,american express"

因此,数据库记录有以逗号分隔的单词或关键字,其中一些是两个或多个单词。

目前,我的 RoR 应用程序提取文档并为每个对 inwords 发出 split(',') 命令的文档提取 inwords,然后遍历每个文档并查看它是否存在于字符串中。

我真的很想找到一种方法将这种类型的搜索推送到实际的数据库查询中,以加快处理速度。我可以将数据库中的 in_words 更改为如下数组:

in_words: ["georgia", "american express"] 

但我仍然不确定如何查询这个?

总而言之,我的目标是通过将该人的 inwords/关键字列表与传入字符串进行比较来找到与传入字符串匹配的人。并在数据库层执行此查询。

提前感谢您的建议

4

2 回答 2

1

作为第一步,您绝对应该将 in_words 拆分为一个数组。

您的查询仍然是一个棘手的问题。

接下来考虑对该数组字段使用$regex查询。

构造正则表达式会有点困难,因为您想匹配输入字符串中的任何单个单词,或者它出现任何一对作品(多少个单词??)。您可能会从我的博客条目中获得更多关于如何构建合适的正则表达式的想法,在这里我将输入字符串的子字符串与数据库进行匹配(正常 LIKE 操作的逆操作)。

于 2012-04-22T03:55:14.123 回答
0

您可以通过将长字符串拆分为单独的标记并将它们放入单独的数组来解决此问题。并使用$all查询有效地找到匹配的关键字。

查看样品

> db.splitter.insert({tags:'John Doe is from Florida and is a fan of American Express'.split(' ')})
> db.splitter.insert({tags:'John Doe is a super man'.split(' ')})
> db.splitter.insert({tags:'John cena is a dummy'.split(' ')})
> db.splitter.insert({tags:'the rock rocks'.split(' ')})

当你查询

> db.splitter.find({tags:{$all:['John','Doe']}})

它会回来

> db.splitter.find({tags:{$all:['John','Doe']}})
{ "_id" : ObjectId("4f9435fa3dd9f18b05e6e330"), "tags" : [  "John",     "Doe",  "is",   "from",     "Florida",  "and",  "is",   "a",    "fan",  "of",   "American",     "Express" ] }
{ "_id" : ObjectId("4f9436083dd9f18b05e6e331"), "tags" : [ "John", "Doe", "is", "a", "super", "man" ] }

请记住,此操作区分大小写。

如果您正在寻找部分匹配,请$in改用$all

此外,您可能需要在插入之前删除干扰词('a'、'the'、'is'...)以获得准确的结果。

我希望很清楚

于 2012-04-22T16:54:01.243 回答