使用Meteor.js和MongoDB进行全文搜索

8

我正在尝试使用Meteor.js,并寻找一种可以在Meteor/MongoDB服务器上运行的全文搜索引擎。看起来Meteor还没有开发出这个功能。

我想知道是否有现有的解决方案可以为Meteor应用程序添加全文搜索。

我唯一能找到的是MongoLantern,它具有node.js API。我该如何将MongoLantern添加到我的Meteor应用程序中?


1
这与您的问题有些不相关,但似乎有关于ElasticSearch的热议,它有一个JS API:https://github.com/fullscale/elastic.js。我还发现了一些与Mongo相关的NPM模块,用于全文搜索:https://npmjs.org/package/mongoose-fulltext和https://npmjs.org/package/mongoose-fts。 - mjhm
谢谢mjhm,ElasticSearch很棒。我会去看看的。 - AdamNYC
4个回答

4

谢谢 Andy。那将是最好的。 - AdamNYC
但是,根据Mongo文档,文本索引仅适用于text()方法。我认为meteor.js目前还不支持它。 - geekonaut
据我所知,在开发过程中Meteor使用的模拟Mongo中没有启用文本搜索的方法。但是我猜在开发过程中可以指向我的真实MongoDB。 - Nate

1
请看 http://lunrjs.com/,这也可能有助于获得真实Meteor应用程序的近乎即时的性能。

0

还有一种使用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");

您可以通过文档了解有关上述每个功能的更多信息。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接