流星搜索源包中的短语搜索

时间:2018-07-02 01:38:46

标签: regex search meteor

我有一个流星应用程序,为此我添加了搜索源程序包以搜索某些集合,并且它部分起作用。也就是说,当我搜索术语foo bar时,它会返回“ foo”和“ bar”中每一个的结果。很好,但是我还希望能够用以下方式将这些术语用引号引起来:"foo bar",并仅获得完全匹配的结果。当我这样做的时候,我得到了一个空集。这是我的服务器代码:

//Server.js
SearchSource.defineSource('FruitBasket', function(searchText, options) {  
    // options = options || {}; // to be sure that options is at least an empty object
    if(searchText) {
    var regExp = buildRegExp(searchText);
    var selector = {$or: [
      {'fruit.name': regExp},
      {'fruit.season': regExp},
      {'fruit.treeType': regExp}
    ]};

    return Basket.find(selector, options).fetch();
  } else {
    return Basket.find({}, options).fetch();
  }
});

function buildRegExp(searchText) {
  // this is a dumb implementation
  var parts = searchText.trim().split(/[ \-\:]+/);
  return new RegExp("(" + parts.join('|') + ")", "ig");
}

和我的客户代码:

//Client.js
Template.dispResults.helpers({

  getPackages_fruit: function() {
    return PackageSearch_fruit.getData({
      transform: function(matchText, regExp) {
        return matchText.replace(regExp, "<b>$&</b>")
      },
      sort: {isoScore: -1}
    });
  }
});

谢谢!

1 个答案:

答案 0 :(得分:1)

我已经修改了.split模式,以便它忽略双引号之间的所有内容。

/[ \-\:]+(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/

因此,您只需将精确的词组搜索用双引号括起来,就不会拆分。
还有一件事;由于我们不需要引号,因此可以在下一行中使用带有正则表达式的.map函数将其删除,该正则表达式将替换字符串部分开头或结尾的双引号:/^"|"$/

示例代码:

function buildRegExp(searchText) {
  // exact phrase search in double quotes won't get split  
  var arr = searchText.trim().split(/[ \-\:]+(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/);
  var parts = arr.map(function(x){return x.replace(/^"|"$/g, '');});
  return new RegExp("(" + parts.join('|') + ")", "ig");
}
console.log(buildRegExp("foo bar"));
console.log(buildRegExp("\"foo bar\""));