2014-07-12 52 views
38

據我瞭解,自3.8.9版本開始,貓鼬支持全文搜索。但我找不到一個好的文檔!
我想要做的事,如:在貓鼬中使用重量進行全文搜索

db.collection.ensureIndex(
    // Fields to index 
    { 
     animal: "text", 
     color: "text", 
     pattern: "text", 
     size: "text" 
    }, 

    // Options 
    { 
     name: "best_match_index", 

     // Adjust field weights (default is 1) 
     weights: { 
      animal: 5, // Most relevant search field 
      size: 4 // Also relevant 
     } 
    } 
) 

我可以用純貓鼬做呢?或者我必須使用一些像mongoose-text-search這樣的插件?如果沒有重量?
我應該怎麼做?

+0

你有沒有打過電話['index'(http://mongoosejs.com/docs/api.html#schema_Schema-index)在架構上添加文本索引? – JohnnyHK

+0

我在schema中做了索引:'text',但是我想像上面的例子那樣在多個字段上索引。 –

+0

不要在模式定義中聲明它,_call_模式的'index'方法。 http://mongoosejs.com/docs/api.html#schema_Schema-index – JohnnyHK

回答

87

是的,您可以在Mongoose> = 3.8.9中使用全文搜索。首先,一個集合最多隻能有一個文本索引(請參見docs)。因此,要定義文本索引several fields,需要複合索引:

schema.index({ animal: 'text', color: 'text', pattern: 'text', size: 'text' }); 

現在你可以使用$text query operator這樣的:

Model 
    .find(
     { $text : { $search : "text to look for" } }, 
     { score : { $meta: "textScore" } } 
    ) 
    .sort({ score : { $meta : 'textScore' } }) 
    .exec(function(err, results) { 
     // callback 
    }); 

這也會按相關性排序評分結果。

至於weights,您可以嘗試將權重選項對象傳遞給index()方法(您在此定義複合索引)(至少在v4.0中工作)。貓鼬)的1:

schema.index({ animal: 'text', color: 'text', pattern: 'text', size: 'text' }, {name: 'My text index', weights: {animal: 10, color: 4, pattern: 2, size: 1}}); 
+5

返回錯誤:需要恰好一個文本索引$ text查詢 – Mallen

+1

來定義幾個字段的文本索引,則需要複合索引。確保你正在定義複合索引。 – eagor

+0

這個程序記錄在某處嗎?我試圖用貓鼬使用文本索引,但它不起作用。我創建了一個複合索引,我已經使用了$ text運算符(如您的示例),但結果始終是一個空文檔。 – ira

1

從MongoDB 2.6開始,一個集合最多隻能有一個文本索引(記錄爲here)。因此,您將無法使用當前版本的MongoDB來執行您想要的操作。真的,對於複雜文本搜索問題,根據匹配位置的不同權重要求,您應該考慮一個全面的文本搜索解決方案,如Solr或ElasticSearch。

如MongoDB的一種解決方法,可以手動標記化領域中,將它們存儲爲關鍵字數組和索引它們:

animal: ["The", "quick", "brown", "fox", "jump", ..., "dog"] 

然後像

db.test.find查詢({動物:{$ in:[「brown」,「shoes」]})

模仿文本搜索。這種方法存在一些侷限性,例如設置它所需的手動工作,不會出現例如與「夢」相匹配的「夢」,事實上停用詞不會像在正常的文本索引以及沒有任何權重機制。

+1

事實上,我只有一個帶有多個字段的文本索引。打擊碼是.getIndexes()的一部分。我用[mongoose-text-search](https://www.npmjs.org/package/mongoose-text-search)做了它,我正在尋找它的純貓鼬版本。 ' \t { \t \t 「V」:1, \t \t 「鍵」:{ \t \t \t 「_fts」: 「文本」, \t \t \t 「_ftsx」:1 \t \t}, \t \t 「NS」: 「公共日記dev.diaries」, \t \t 「名」: 「全搜索索引」, \t \t 「背景」:真實, \t \t 「砝碼」:{ \t \t \t 「標籤」:1, \t \t \t 「文」:1, \t \t \t 「稱號」:1 \t \t}, \t \t 「DEFAULT_LANGUAGE」: 「英語」, \t \t 「language_override」: 「語言」, \t \t 「textIndexVersion」:1 \t} ' –

-1
var searchQuery=new RegExp('dam', 'i'); 
    var query = { firstName : searchQuery }; 
    Model.find(query ... 
+0

這個答案是炸彈!我浪費了最後兩個小時試圖爲我的模式添加一個文本索引,而這個簡單的答案就是我所需要的。好哇! – ecg8

0

我發現下面的文章,導致我的http://code.tutsplus.com/tutorials/full-text-search-in-mongodb--cms-24835 我放棄了在頂級答案創建索引使用以下

db.tablename.dropIndex({"indexname_text"}) 

我得到的名單與此命令索引

db.tablename.getIndexes() 

然後,我用以下來創造E中的索引

db.tablename.createIndex({"$**":"text"}) 

以下命令在貓鼬工作

model.find(
    {$text: {$search: "text you are searching for"}}, 
    {score: {$meta: "textScore"}}) 
    .sort({score:{$meta:"textScore"}} 
) 
.exec(function(err, results) { 
    `enter code here`if(!err){ 
    console.log('results ' + results); 
} 
else 
{ 
    console.log(err); 
} 
});