如何使用Meteor.js进行全文搜索?
例如,如果我在 mongo light 中搜索帖子集合中的消息字段。
我读过关于Spomet的信息,但我不知道如何使用它。
此外,使用 mongo 的简单全文搜索示例会很好。
谢谢。
您可以执行一些操作,例如使用正则表达式搜索所需字段。我在项目中自己使用这样的解决方案,但是正则表达式是无法转义的。
假设您将会话变量"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 };
};
搜索.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 上没有足够的声誉)。
还有另一种方法可以使用 Meteor 实现解决方案。它是搜索源。
这是一种提前输入,但没有 UI 部分。它公开了一个反应式数据源,您可以在其中使用它根据需要使用 Blaze 构建 UI。
- 下面是一个演示应用: https://instant-search-demo.meteor.com/
上面的应用程序是一个即时搜索应用程序,用于搜索流星包。本文介绍了如何使用搜索源进行构建
简而言之,这就是搜索源的工作方式:
在客户端中,创建源
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");
您可以从文档中了解有关上述每个方法如何工作的更多信息。