2017-08-31 64 views
0

這是我的樣本數據MongoDB的全文搜索裏面嵌入對象

{ 
    _id: 123123123, 
    author:{ 
    name : "username" 
    }, 
    data:{ 
    title : "Hello World" 
    } 
} 

這是我INDEX命令:db.post.createIndex({"data.title":"text"})

但是,當我執行db.post.find({ $text: { $search: "Hello" } })我得不到任何回報。

我應該運行什麼命令來爲mongodb中的嵌入對象編制索引?

回答

0

這是:db.post.createIndex({"data.title":"text"})是在嵌入字段上創建文本索引的正確命令。

此:db.post.find({ $text: { $search: "Hello" } })是使文本索引在嵌入字段中搜索值Hello的正確方法:data.title

你正在做的一切正確。爲了驗證這一點,我將文檔寫入集合,使用您提供的createIndex()命令在該集合上創建了一個文本索引,並使用您提供的find()命令對其進行搜索,並且返回文檔

所以,也許這個問題在別處。我建議你:

  • 確認文本索引爲絕對創建。您可以通過運行db.post.getIndexes()做到這一點,如果文本索引存在和不蓋data.title那麼你應該看到像這樣的輸出從該命令:

    { 
        "v" : 2, 
        "key" : { 
         "_fts" : "text", 
         "_ftsx" : 1 
        }, 
        "name" : "data.title_text", 
        "ns" : "<your database name>.post", 
        "weights" : { 
         "data.title" : 1 
        }, 
        "default_language" : "english", 
        "language_override" : "language", 
        "textIndexVersion" : 3 
    } 
    
  • 確認有肯定一包含Hello的文件data.title。你可以通過運行一個簡單的查找來實現:db.post.find({'data.title': { $regex: /Hello/ } })

  • 確認此命令:db.post.find({ $text: { $search: "Hello" } })絕對使用您的文本索引。您可以通過調用與.explain()(例如db.post.find({ $text: { $search: "Hello" } }).explain())該命令做到這一點,輸出應包含這樣的事情:

    "inputStage" : { 
         "stage" : "TEXT_MATCH", 
         "inputStage" : { 
          "stage" : "TEXT_OR", 
          "inputStage" : { 
           "stage" : "IXSCAN", 
           "keyPattern" : { 
            "_fts" : "text", 
            "_ftsx" : 1 
           }, 
           "indexName" : "data.title_text", 
           "isMultiKey" : true, 
           "isUnique" : false, 
           "isSparse" : false, 
           "isPartial" : false, 
           "indexVersion" : 2, 
           "direction" : "backward", 
           "indexBounds" : {} 
          } 
         }