2013-12-22 92 views
4

我有一個問題,我有收藏,我想將文本搜索索引設置爲2個字段(描述和標題)。但是,當我添加第二個索引時,我得到以下錯誤和文本搜索停止工作。MongoDB全文搜索索引:錯誤:文本索引太多,爲什麼?

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

當我刪除一個索引搜索開始再次工作。問題是什麼?一個集合僅支持一個字段的全文搜索索引?

我在windows下使用當前版本的mongodb,我使用的是mongodb java驅動程序API。

謝謝

+0

你有多個文本索引,目前你只能有一個,你想要的是這個鏈接:http://docs.mongodb.org/manual/tutorial/create-text-index-on-multiple-fields/ – Sammaye

+0

問題是,然後我添加第二個文本索引到相同的集合,全文搜索停止工作,我得到那個錯誤。似乎有多個字段的文本搜索無效。 –

+0

你能告訴我們一個多個字段不工作的例子嗎?您應該能夠確保跨多個字段的一個索引 – Sammaye

回答

7

MongoDB只允許每個集合有一個文本索引。

但是你可以使用文本索引跨越多個領域:

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

這樣,當您正在搜索的短語在任一被發現就會得到結果。當這不是你想要的,比如當你有兩個搜索查詢,每個搜索查詢返回一個域的結果而不是另一個時,你有兩個選擇。

  1. 使用多字段文本索引,但放棄來自應用程序層錯誤字段的結果。
  2. 將兩個字段中的一個提取到不同的集合中。該集合中的文檔可能包含完整副本,編輯過的副本或僅包含您索引的字段和原始文檔的_id
+0

感謝它的運作!實際上,對於多個字段的索引是真實的,我試圖爲一個字段添加一個索引,這是爲什麼mongo失敗的原因。謝謝。 –

+0

嗨,我是半新的節點,我不知道在哪裏把這個語法。 'db'從哪裏來? – ac360

+0

@ ac360此問題和答案中使用的語法適用於mongodb命令行shell。 – Philipp

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'}})

如果我們在movies集合的title字段上創建文本索引,然後執行文本搜索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