MongoDB全文搜索索引:错误:文本索引太多,为什么?

时间:2013-12-22 20:35:34

标签: java mongodb full-text-search mongodb-java

我有一个问题,我有收藏,我想将文本搜索索引设置为2个字段(描述和标题)。但是,当我添加第二个索引时,我得到以下错误,文本搜索停止工作。

{ "serverUsed" : "localhost/127.0.0.1:27017" , "ok" : 0.0 , "errmsg" : "too many text index for: testdb.users"}

当我再次删除一个索引搜索开始工作时。问题是什么?一个集合仅支持一个字段的全文搜索索引????

我在windows下使用当前版本的mongodb,我正在使用mongodb java驱动程序API。

由于

2 个答案:

答案 0 :(得分:7)

MongoDB每个集合只允许一个文本索引。

但是你可以使用跨越多个字段的文本索引:

db.collection.ensureIndex( {
    description: "text",
    title: "text"
} );

这样,当您搜索的短语中找到时,您将获得结果。如果这不是您想要的,就像您有两个搜索查询,每个搜索查询都返回其中一个字段而不是另一个字段的结果时,您有两个选项。

  1. 使用多字段文本索引,但丢弃来自应用程序层错误字段的结果。
  2. 将两个字段中的一个提取到另一个集合。该集合中的文档可以包含完整副本,编辑副本,也可以只包含您索引的字段和原始文档的_id

答案 1 :(得分:1)

要在密钥上创建基于文本的索引,请使用命令db.collectionName.ensureIndex({'textColumnName': 'text'})。应用此索引后,使用搜索命令搜索单词db.collectionName.find({$text: {$search:'your text here'}})。有一个基于其对结果进行排名的文本分数,以便将其投影到分数键中,如下所示:db.collectionName.find({$text: {$search:'your text here'}}, {score: {$meta: 'textScore'}}).sort({score: {$meta: 'textScore'}})

如果我们在title集合的movies字段上创建文本索引,然后执行文本搜索db.movies.find( { $text : { $search : "Big Lebowski" } } )。假设它们在电影收藏中,将返回以下文件:

  • { "title" : "The Big Lebowski" , star: "Jeff Bridges" }

  • { "title" : "Big" , star : "Tom Hanks" }

  • { "title" : "Big Fish" , star: "Ewan McGregor" }

这是因为,Big& Lebowski