我有一个基本的,区分大小写的,特定于术语的搜索,下面的代码。它现在可以工作,但我想要的东西(按重要性排序):
1:忽略大小写(即“hi”和“Hi”都是相同的。toLowerCase
不是一个选项而且不是同一个东西)
2:如果搜索查询为“搜索字词”且搜索字符串为“搜索字词”,则会产生匹配。作为示例。
3:即使在找到更多匹配的命中后,也会搜索整个字符串。
目的是搜索具有特定<p>
的{{1}}代码。如果有,则显示它。最后,我将在一个循环中使用它,它将搜索许多id
标签并显示具有命中的标签并隐藏其中的标签。
CODE:
<p>
答案 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)