MongoDB文本搜索'一些'

时间:2016-10-12 13:13:02

标签: mongodb search text

有人可以解释我做错了什么。我使用的是MongoDB版本:3.2.6。 在下面的例子中,我在集合'users'中创建了两个类似的文档。然后我为$ text运算符创建复合索引,然后搜索一些文本'John':

> db.users.insert({name: 'John Smith', email: 'john.smith@gmail.com'})
WriteResult({ "nInserted" : 1 })
> db.users.insert({name: 'Some Man', email: 'some@yahoo.com'})
WriteResult({ "nInserted" : 1 })
> db.users.createIndex({name: 'text', email: 'text'})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
}
> db.users.find({$text:{$search: 'John'}})
{ "_id" : ObjectId("57fe313f4dfa1e8339b08174"), "name" : "John Smith", "email" : "john.smith@gmail.com" }

正如你看到所有工作正常但如果我尝试使用'Some'这个词找到文件那么它是行不通的(空结果):

> db.users.find({$text:{$search: 'Some'}})
>

例如,如果尝试通过其他单词'Man'找到这个文档,那么所有工作正常或如果将'Some'更改为'Somer',那么所有工作也都很好。 什么神秘的'有些'可能是特殊的词或什么... 谢谢你的帮助。

3 个答案:

答案 0 :(得分:1)

正如Erik所说,Some被解释为英语的停用词,如果没有另外指定,它是文本索引的默认语言。

如果您需要针对特定​​方案的变通方法,只需在定义索引时更改默认语言,方法是将其设置为none

db.users.createIndex(
    {name: 'text', email: 'text'},
    {default_language: 'none'}
);

因此,您创建的索引将被标记,因为字段内容被标记化并与您提供的关键字进行比较,返回所有匹配的记录。

> db.users.find({ $text: { $search: "Some" }});
{ "_id" : ObjectId("57fe3e21a134e614a7178c1c"), "name" : "Some Man", "email" : "some@yahoo.com" }

答案 1 :(得分:0)

我认为问题在于'有些'被认为是一个停止词,因此在搜索中被丢弃。对于'and''his',您会得到同样的信息。

插入例如此用户:

db.users.insert({name: 'Tom and his little brother', email: 'tom@yahoo.com'})

这是查询时得到的:

> db.users.find({$text:{$search: 'and'}})

> db.users.find({$text:{$search: 'his'}})

> db.users.find({$text:{$search: 'little'}})
{ "_id" : ObjectId("57fe39ed8aaf457673d4354d"), "name" : "Tom and his little brother", "email" : "tom@yahoo.com" }

答案 2 :(得分:0)

在mongodb中,索引数据的默认语言是英语。

因此,它忽略了英语的停止词。要停止忽略停用词并将其包含在搜索中,我们可以在创建索引时不使用默认语言。

如果指定语言值为“none”,则文本搜索使用简单的标记化,没有停用词列表且没有词干。 实施例

db.users.createIndex( 
    {name: 'text', email: 'text'}, 
    { default_language: "none" }
)