在某些情况下,MongoDB文本索引不会返回正确的结果

时间:2016-10-24 07:32:16

标签: mongodb full-text-search

我对MongoDB数据库有一个非常奇怪的问题。我有一个有近10,000条记录的集合。它有一个复合索引和一个常规索引。

复合指数:

{
    is_archived: 1,
    name: 'text',
    ean: 'text',
    model: 'text',
    mpn: 'text',
    upc: 'text',
    notes: 'text'
}

常规:

{
    is_archived: 1
}

假设集合中有这样的记录:

{
    is_archived: false,
    name: 'String1 string2 string3 string4'
    ean: '',
    model: '',
    mpn: '',
    upc: '',
    notes: ''    
  }

这样的查询(目标是以任何顺序返回包含所有这些单词的所有文档):

db.collection.find({
    is_archived: false,
    $text: {
        $search: '"String1""string2""string3""string4"'
    }
})

将返回上述文件。

像这样的查询:

db.collection.find({
    is_archived: false,
    $text: {
        $search: '"String1""string2"'
    }
})

将返回上述文件。

像这样的查询:

db.collection.find({
    is_archived: false,
    $text: {
        $search: '"string2""string3"'
    }
})

将返回上述文件。

像这样的查询:

db.collection.find({
    is_archived: false,
    $text: {
        $search: '"String1""string3"'
    }
})

赢了< tt 返回上述声明。

同样的问题也会出现在其他文件中,但不会出现在所有文件中。

  • 我正在运行MongoDB的2. *版本。较新版本的同一数据库也存在同样的问题。
  • 我尝试在新数据库上复制它但没有成功。
  • 我试图重新索引/删除并重新创建索引而没有任何运气。

我想问两个问题:

  • 你以前见过这个吗?它有意义吗?
  • 调试此问题的正确方法是什么?我应该使用explain吗?

谢谢你们,这个问题真让我疯狂。

1 个答案:

答案 0 :(得分:0)

默认情况下,短语搜索对所有指定的关键字进行OR搜索,即它将查找包含关键字String1,String2,String3或String4的文档

db.collection.find({$text: {$search: "String1 String3"}}, {score: {$meta: "text Score"}}).sort({score:{$meta:"text Score"}})

我认为你错过了String1和String3之间的空间。