如何使用Meteor.js进行全文搜索?
例如,如果我在mongo light中搜索posts集合中的消息字段。
我读过Spomet,但我不清楚如何使用它。
此外,使用mongo的简单全文搜索示例也不错。
感谢。
答案 0 :(得分:1)
您可以使用正则表达式搜索所需字段。我自己在一个项目中使用这样的解决方案,但正则表达式没有转义。
假设你有一个会话变量'search'设置为所需的查询,那么你可以这样做:
<强> search.js 强>
Template.search.results = function () {
var query = Session.get('search');
var find = {};
if (!!query) {
// FIXME: Runs unescaped as regex, absolutely not ok
_.extend(find, { message: { $regex: query, $options: 'i' } });
}
var posts = Posts.find(find);
return { posts: posts };
};
<强> search.html 强>
<template name="search">
...
<!-- search results begin -->
{{#each results.posts}}
{{> postItem}}
{{/each}}
<!-- search results end -->
...
</template>
我从项目hmmm获得了此示例,并在我的项目minutocash中自行实现,您可以在其中测试搜索功能(使用预定义的用户登录,以查看搜索表单) )。上面的代码示例的工作实现在github.com/dandelo/minutocash/tree/master/client/views/offers/search上可见(对不起,我不能发布两个以上的链接,因为我没有足够的Stack Overflow上的声誉。
答案 1 :(得分:1)
还有另一种方法可以使用Meteor实现解决方案。这是Search Source。
这是一种 typeahead 但没有UI部分。它公开了一个反应式数据源,您可以根据需要使用它来使用Blaze构建UI。
以上应用程序是一个搜索Meteor包的即时搜索应用程序。 this文章
中记录了如何使用搜索源构建它简而言之,这就是搜索源的工作原理:
var options = {
keepHistory: 1000 * 60 * 5,
localSearch: true
};
var fields = ['packageName', 'description'];
PackageSearch = new SearchSource('packages', fields, options);
SearchSource.defineSource('packages', function(searchText, options) {
var options = {sort: {isoScore: -1}, limit: 20};
if(searchText) {
var regExp = buildRegExp(searchText);
var selector = {packageName: regExp, description: regExp};
return Packages.find(selector, options).fetch();
} else {
return Packages.find({}, options).fetch();
}
});
function buildRegExp(searchText) {
// this is dumb implementation
var parts = searchText.trim().split(' ');
return new RegExp("(" + parts.join('|') + ")", "ig");
}
Template.searchResult.helpers({
getPackages: function() {
return PackageSearch.getData({
transform: function(matchText, regExp) {
return matchText.replace(regExp, "<b>$&</b>")
},
sort: {isoScore: -1}
});
}
});
PackageSearch.search("the text to search");
您可以从documentation了解有关上述每种方法的更多信息。