2015-01-11 104 views
2

我使用MeteorJS與MongoDB相關聯來創建一個全文搜索功能,我所做的是我按照這裏的步驟:http://meteorpedia.com/read/Fulltext_search,我的搜索功能現在有點「工作」了。MeteorJS - MongoDB - 爲什麼全文搜索只返回完全匹配?

下面是我的一些重要代碼:

服務器/拉鍊index.js文件:

Meteor.startup(function() { 
    var search_index_name = 'my_search_index'; 
    // Remove old indexes as you can only have one text index and if you add 
    // more fields to your index then you will need to recreate it. 
    Zips._dropIndex(search_index_name); 

    Zips._ensureIndex({ 
     city: 'text', 
     state: 'text' 
    }, { 
     name: 'my_search_index' 
    }); 
}); 

服務器/ lib目錄/文件search_zips.js

var _searchZips = function (searchText) { 
    var Future = Npm.require('fibers/future'); 
    var future = new Future(); 
    MongoInternals.defaultRemoteCollectionDriver().mongo.db.executeDbCommand({ 
      text: 'zips', 
      search: searchText, 
      project: { 
       id: 1 // Only return the ids 
      } 
     } 
     , function(error, results) { 
      if (results && results.documents[0].ok === 1) { 
       var x = results.documents[0].results; 
       future.return(x); 
      } 
      else { 
       future.return(''); 
      } 
     }); 
    return future.wait(); 
}; 

現在的問題是:說,我有一個文件name = Washington, state = DC

然後,當我提交搜索key =「Washington」時,它將返回所有文檔與name = Washington;但當我提交搜索鍵=「洗」只,它什麼也沒有返回!

因此,我懷疑MongoDB的全文搜索要求搜索關鍵字與文檔的字段值完全相同?你們能幫我改進我的搜索功能嗎,以便它仍然使用MongoDB的全文搜索,但是如果我提交了完整的搜索關鍵字,它能夠返回文檔事件嗎?

我一直在這玩幾個小時。希望你們能幫忙。非常感謝您的高級!

回答

6

MongoDB full text search通過將所有字符串拆分爲單個單詞(使用基於索引語言的一些詞幹)來工作。這意味着您只能搜索完整的單詞並且不能執行任何模糊搜索。

當你想搜索單詞片段,你可以search with a regular expression。但請記住,正則表達式不能使用文本索引(但在正則表達式以字符串開頭(^)令牌開始)時,它們在某些情況下可能會限制使用正常索引。

例如,查詢db.Zips.find({ name: /^Washing/ }將查找名稱以"Washing"開頭且受益於{ name: 1 }索引的所有文檔。您還可以使用db.Zips.find({ name: /DC/ }查找名稱包含"DC"任意位置的所有文檔,但不會受益於任何索引,並且需要執行完整的集合掃描。

當您需要更高級的文本搜索功能時,您應該考慮將MongoDB與專門的解決方案(如Lucene)配對。