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

phrase search in meteor search-source package

我有一个 meteor 应用程序,我为其添加了搜索源包来搜索某些集合,并且它可以部分运行。也就是说,当我搜索术语 foo bar 时,"foo" 和 "bar" 中的每一个都会得到 returns 结果。这很好,但我也希望能够以这种方式将术语括在引号中:"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}
    });
  }
});

提前致谢!

我修改了 .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\""));