流星.js全文搜索



如何使用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");

您可以从文档中了解有关上述每个方法如何工作的更多信息。

最新更新