流星搜索源包中的短语搜索
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\""));
我有一个 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\""));