2

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

1:忽略大小写(即“hi”和“Hi”都是相同的。toLowerCase不是一个选项,也不是一回事)

2:例如,如果搜索查询是“搜索词”并且搜索的字符串是“搜索词”,则会产生命中。

3:即使在找到更多匹配项后也搜索整个字符串。

目的是搜索<p>具有特定id术语的标签。如果有,则显示它。最终,我将在一个循环中使用它,它将搜索许多<p>标签并显示有命中的标签并隐藏没有命中的标签。

代码:

<!DOCTYPE html>
<html>
    <body>
        <p id="demo">Click the button to locate where in the string a specifed value occurs.</p>
        <p id="demo1" style="display:none;">Hello world, welcome to the universe.</p>
        <button onclick="myFunction()">Try it</button>

        <script>
            function myFunction() {
                var x = document.getElementById("demo1")
                var str = x.innerHTML.toString();
                var n = str.indexOf("welcome");
                if (n != -1) {
                    x.style.display = 'inline';
                } else {
                    x.innerHTML = 'Negative';
                    x.style.display = 'inline';
                }
            }
        </script>

    </body>
</html>
4

3 回答 3

4

我将从标记您的输入字符串开始:

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"]

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

这是一个非常简单的示例,不会处理大量极端情况,但至少您了解了如何使用关键字进行搜索。

于 2012-12-28T11:16:44.570 回答
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.

从这里借来的

于 2012-12-28T11:14:16.080 回答
0

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

这是一个:链接

希望这可以帮助

于 2012-12-28T11:00:35.860 回答