我想用javascript进行高级搜索。怎么样?

时间:2012-12-28 10:57:23

标签: javascript search

我有一个基本的,区分大小写的,特定于术语的搜索,下面的代码。它现在可以工作,但我想要的东西(按重要性排序):

1:忽略大小写(即“hi”和“Hi”都是相同的。toLowerCase不是一个选项而且不是同一个东西)

2:如果搜索查询为“搜索字词”且搜索字符串为“搜索字词”,则会产生匹配。作为示例。

3:即使在找到更多匹配的命中后,也会搜索整个字符串。

目的是搜索具有特定<p>的{​​{1}}代码。如果有,则显示它。最后,我将在一个循环中使用它,它将搜索许多id标签并显示具有命中的标签并隐藏其中的标签。

CODE:

<p>

3 个答案:

答案 0 :(得分:3)

我首先通过标记输入字符串来开始:

function tokenize(input) {
    return input.toLowerCase().replace(/[^a-z0-9_\s]/g, '').split(/\s+/g)
}

这与您的搜索字词有关:

> tokenize("I'm your search string.")
["im", "your", "search", "string"]

接下来,剥掉后缀(我甚至不打算尝试处理这些无法工作的情况。这就是NLP的用途):

function remove_suffix(token) {
    return token.replace(/(ing|s)$/, '');
}

它会对每个令牌执行此操作:

> remove_suffix('searching')
"search"
> remove_suffix('terms')
"term"

因此,对于每个查询字符串,您可以构建关键字列表:

function get_keywords(query) {
    var tokens = tokenize(query);
    var keywords = tokens.map(remove_suffix);
    keywords.sort();

    return keywords;
}

它会将您的查询转换为关键字:

> get_keywords('searching terms')
["search", "term"]
> get_keywords('term search')
["search", "term"]

现在,您只需检查查询字符串的关键字是否包含在搜索字符串的关键字中。

这是一个非常简单的示例,并且不会处理大量的角落情况,但至少您会看到如何使用关键字进行搜索。

答案 1 :(得分:2)

通过一些调整,我应该满足您的要求。 尽管=),在后端执行此操作可能会更好。

// returns the indices of the found searchStr within str, case sensitive if needed
function getIndicesOf(searchStr, str, caseSensitive) {
    var startIndex = 0, searchStrLen = searchStr.length;
    var index, indices = [];
    if (!caseSensitive) {
        str = str.toLowerCase();
        searchStr = searchStr.toLowerCase();
    }
    while ((index = str.indexOf(searchStr, startIndex)) > -1) {
        indices.push(index);
        startIndex = index + searchStrLen;
    }
    return indices;
}

// this splits the search string in an array of search strings
var myStringArray = mySearchString.split("\\s+");
var result = true;
// loop over all the split search strings, and search each seperately
for (var i = 0; i < myStringArray.length; i++) {
    var indices = getIndicesOf(myStringArray[i], "I learned to play the Ukulele in Lebanon.", false);
    if(indices && indices.length>0){
        // do something with the indices of the found string
    } else {
        result = false;
    }
}
// result will be false here if one of the search terms was not found.

借鉴here

答案 2 :(得分:0)

看看正则表达式引擎。这需要一些时间来学习,但一旦你知道它,你可能会在这里实现你的目标。

以下是:link

希望这有帮助