在我的内容中找出一组搜索词是否包含字符串的最快方法?

时间:2013-09-06 01:12:53

标签: javascript arrays parsing search full-text-search

我正在尝试创建一个搜索框,当用户在搜索字词中键入内容时,它会不断评估搜索字词是否在我的内容中。

我有一系列搜索词和短语,例如:

["home", "and", "garden", "weeding a flower patch", "best tools"]

我还有一个字符串,其中包含我正在搜索的内容,例如:

"Using your hands to dig your flower holes brings you closer to the earth."

在Javascript中,我需要查看是否有任何搜索词存在于此字符串的任何部分中。我不需要知道哪些术语匹配或在哪里,只是该字符串中的某个地方至少是我的一个搜索术语的一个实例。这是非常重要,但它也会在内容字符串中找到部分匹配。例如,在上面的示例中,它应该返回true,因为单词“hands”包含来自我的搜索词的单词“and”。以最快,最少计算的方式完成它也很重要,因为我将连续数千次调用此函数。我怎样才能做到最好?

3 个答案:

答案 0 :(得分:4)

与Almog Baku的解决方案有点相似的是我将如何做到这一点:

var makeSearcher = function(terms) {
    var regex = new RegExp(terms.join("|"));
    return function(str) {
        return regex.test(str);
    };
};

var searcher = makeSearcher(["home", "and", "garden", 
                             "weeding a flower patch", "best tools"]);

searcher("Using your hands to dig ...");  //=> true
searcher("Using your fingers to dig ..."); //=> false

此技术仅在您的搜索字词不包含正则表达式中特殊的任何字符时才有效。但我认为这可能相当有效,假设您的搜索条件相对固定。

答案 1 :(得分:2)

我的建议很简单:

为了获得最佳效果(=更快!)我们应该构建一个重新表达式,而不是简单地使用搜索功能。

String.prototype.arraySearch = function(terms) {
    var regex = new RegExp(terms.join("|"));
    return regex.test(this);
}

比你可以搜索你的字符串:

var text = "Using your hands to dig your flower holes brings you closer to the earth.";
var keywords = ["home", "and", "garden", "weeding a flower patch", "best tools"];
console.log(text.arraySearch(keywords);

//or even
"Using your hands to dig your flower holes brings you closer to the earth.".arraySearch(["home", "and", "garden", "weeding a flower patch", "best tools"]);

答案 2 :(得分:0)

您可以遍历搜索字词并使用JavaScript indexOf函数检查字符串中是否存在搜索字词:

function(needles, haystack){
    var x;
    for(x = 0; x < needles.length; x++){
        if(haystack.indexOf(needles[x]) > -1){
            return true;
        }
    }
    return false;
}