JavaScript搜索算法

JavaScript search algorithm

本文关键字:搜索算法 JavaScript      更新时间:2024-06-06

我正在为我的一个项目开发一个JavaScript客户端搜索系统,在让搜索功能像人们期望的那样运行时遇到了特别的困难。

目前,在数组q中排序并用for循环循环的搜索词(因此q[i]是要处理的当前词)选择它们所属的词,并且彼此之间也没有任何影响。

这导致了两个问题。

  1. 对于第一个问题,搜索intro会返回Introduction文章,正如您所料,但类似地,搜索con也会返回Conditions的文章,这并不是真正有用的功能。

  2. 第二个更严重的问题是,搜索词不会相互影响,因此搜索introduction is important for comedians to setup their jokes时,会返回查询中的"介绍"answers"设置"文章。

在每个搜索词中循环的代码片段(位于围绕每篇文章循环的循环中)并对结果进行优先级排序,如下所示:

rq = new RegExp(q[i], 'gim');
eq = new RegExp("''b" + escape(q[i]) + "''b", 'gi');
if (rq.test(title) || rq.test(keywords)) {
    match = true;
    if (title.match(rq) != null) {
        if (title.match(eq) != null) {
            priority += (title.match(eq).length * 5)
        }
        priority += (title.match(rq).length); // Is this wise?
    }
    if (keywords.match(rq) != null) {
        if (keywords.match(eq) != null) {
            priority += (keywords.match(eq).length * 3);
        }
        priority += (keywords.match(rq).length); // Is this wise?
    }
}

随着算法决策的做出,这些行为是不可避免的,然而我想不出更好的方法来做到这一点(显然还有更好的方法)。也许我只是想得太多了。

一些观察结果:

(1) "正如你所料,搜索intro会返回Introduction文章,但类似地,搜索condition也会返回一篇关于Conditions的文章,这可能不是用户想要的。"我不明白这里的区别。看起来有两种匹配前缀的情况。此外,后缀/inixion将与简介条件匹配,至少与rq正则表达式匹配。

(2) 这里的.match()返回一个匹配字符串的数组,因为您已经设置了g修饰符。如果title是"声音与愤怒",priority += (title.match(rq).length)给予priority是给予愤怒的两倍。我不知道为什么多场比赛应该得到更多的priority。正如Florent所提到的,你可能想把当作停止语,以免这些不重要的单词上的多次匹配淹没了你真正关心的单词的匹配。

(3) 你可能想提供"这个短语中的所有单词,按照这个确切的顺序"、"所有单词,按任何顺序"answers"这些单词中的任何一个"之类的选项。你使用eq是正确的,在单词边界匹配。或者,您可能希望明确支持某种词干或通配符语法,例如,intro"与Introduction匹配,但intro

更新

实现"所有的单词,以任何顺序"都很简单——你可能想得太多了。如果在titlekeywords中找到所有q,则此代码段将match设置为true,否则为false

var match = true;
for (i = 0; i < q.length; i++) {
    eq = new RegExp("''b" + escape(q[i]) + "''b", 'gi');
    if (!eq.test(title)) {
        match = false;
        break;
    }
    if (!eq.test(keywords)) {
        match = false;
        break;
    }
}

您可以做的第一件事是忽略常用词,如a等。

也许关键词应该比标题更重要。