2

我正在为我的一个项目使用 JavaScript 开发客户端搜索系统,并且在让搜索功能按照人们期望的搜索功能运行时遇到了特别的麻烦。

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

这些导致两个问题。

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

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

循环遍历每个搜索词(在循环每篇文章的循环内)并确定结果优先级的代码片段如下:

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?
    }
}

这些行为在算法决策中是不可避免的,但是我根本想不出更好的方法来做到这一点(而且显然有更好的方法)。也许我只是想多了。

4

2 回答 2

2

几点观察:

(1) “搜索intro会返回一篇Introduction文章,正如您所料,但类似地搜索cond会返回一篇关于Conditions的文章,这可能不是用户正在寻找的内容。” 我不明白这里的区别。看起来像匹配前缀的两种情况。此外,后缀/中缀离子将与IntroductionConditions匹配,至少与您的rq正则表达式匹配。

(2).match()这里返回一个匹配字符串的数组,因为您g设置了修饰符。如果title是《喧哗与骚动》,给予的价值是给予狂怒priority += (title.match(rq).length)两倍。我不确定我是否理解为什么多个比赛应该得到更多。正如 Florent 所提到的,您可能希望将and视为停用词以免这些不重要单词的多个匹配淹没您真正关心的单词的匹配。prioritypriority

(3) 您可能希望提供诸如“此短语中的所有单词,按此确切顺序”、“所有单词,按任何顺序”和“这些单词中的任何一个”之类的选项。你在正确的轨道上eq,匹配单词边界。或者,您可能希望明确支持某种词干或通配符语法,例如intro " 匹配Introductionintro不匹配。

更新

实现“所有单词,以任何顺序”很简单——你可能想多了。如果在或中找到所有的,则此代码段设置match为,否则:trueqtitlekeywordsfalse

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;
    }
}
于 2012-08-01T16:23:56.300 回答
0

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

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

于 2012-08-01T12:09:15.273 回答