【问题标题】:JavaScript search algorithmJavaScript 搜索算法
【发布时间】:2012-07-30 07:19:18
【问题描述】:

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

目前,搜索词在数组q 中排序并用for 循环循环(所以q[i] 是当前正在处理的词),选择它们所属的词,然后也不会互相影响。

这会导致两个问题。

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

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

代码 sn-p 循环遍历每个搜索词(在循环每篇文章的循环内)并确定结果的优先级,如下所示:

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

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

【问题讨论】:

    标签: javascript regex algorithm search


    【解决方案1】:

    一些观察:

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

    (2) .match() 此处返回匹配字符串的数组,因为您设置了 g 修饰符。如果title 是“The Sound and the Fury”,priority += (title.match(rq).length)thepriority 是给 fury 的两倍。我不确定我是否理解为什么多个匹配应该得到更多priority。正如 Florent 所提到的,您可能希望将 theand 视为停用词,以免这些不重要单词的多个匹配淹没了您真正关心的单词的匹配。

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

    更新

    实现“所有单词,以任何顺序”很简单——您可能想多了。如果在titlekeywords 中找到所有q,则此sn-p 将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;
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可以做的第一件事是忽略常用词,例如 theandora

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

      【讨论】:

      • 我已经调整了我的本地副本以摆脱这些常用词,这似乎对系统有很大帮助,并且在清除 'rq' 以仅支持精确匹配后,问题'我最初概述的 1' 几乎没有了。我现在的问题主要在于互连查询术语......
      猜你喜欢
      • 2012-05-24
      • 2011-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-17
      • 2018-10-13
      • 2021-03-23
      相关资源
      最近更新 更多