我使用MeteorJS与MongoDB相关联来创建全文搜索功能,我所做的就是按照此处的步骤操作:http://meteorpedia.com/read/Fulltext_search和我的搜索功能是有点"工作"现在
以下是我的一些重要代码:
server / zip-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'
});
});
server / 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
的文档;但是当我仅提交搜索 key =" Washing" 时,它什么都不返回!
所以我怀疑MongoDB的全文搜索要求搜索关键字与文档的字段值完全相同吗?你们可以帮助我改进我的搜索功能,以便它仍然使用MongoDB的全文搜索但是如果我提交完整的搜索它能够返回文档事件钥匙?
我已经坚持了好几个小时。希望你们能提供帮助。非常感谢你的进步!
答案 0 :(得分:6)
MongoDB full text search的工作原理是将所有字符串分成单个单词(使用一些基于索引语言的词干)。这意味着您只能搜索完整的单词,并且无法执行任何模糊搜索。
如果要搜索单词片段,可以search with a regular expression。但请记住,正则表达式不能使用文本索引(但是当正则表达式以字符串开头(^
)标记开头时,它们在某些情况下可以限制使用普通索引。) p>
例如,查询db.Zips.find({ name: /^Washing/ }
将查找名称以"Washing"
开头的所有文档,并将从{ name: 1 }
上的索引中受益。您还可以使用db.Zips.find({ name: /DC/ }
查找名称中包含"DC"
的所有文档,但它不会从任何索引中受益,并且需要执行完整的集合扫描。
当您需要更高级的文本搜索功能时,您应该考虑将MongoDB与Lucene等专用解决方案配对。