Meteor.js全文搜索

时间:2013-12-25 21:06:50

标签: mongodb search text full-text-search meteor

如何使用Meteor.js进行全文搜索?

例如,如果我在mongo light中搜索posts集合中的消息字段。

我读过Spomet,但我不清楚如何使用它。

此外,使用mongo的简单全文搜索示例也不错。

感谢。

2 个答案:

答案 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了解有关上述每种方法的更多信息。