2

私は自分のプロジェクトのためにJavaScriptでクライアント側の検索システムに取り組んでいますが、検索機能が期待どおりに動作するように検索機能を動作させるのに特に問題があります。

現在、配列でソートされ、qループでループされた検索用語forq[i]現在処理されている用語も同様)は、それらが含まれている単語を選択し、相互に影響を与えません。

これらは2つの問題を引き起こします。

  1. 最初の問題では、ご想像のとおり、 introを検索すると紹介記事が返されますが、同様にconを検索すると、 Conditionsに関する記事が返されます。これは、あまり役に立たない機能です。

  2. 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に関する記事が返されます。これは、ユーザーが探していたものではない可能性があります。」ここでの違いはわかりません。プレフィックスが一致する2つのケースのように見えます。また、接尾辞/中置、少なくとも正規表現では、はじめにと条件の両方に一致します。rq

(2)ここでは、修飾子が設定され.match()ているため、一致する文字列の配列が返されます。「音と怒り」のg場合、怒り2倍の量を与えます。複数の一致がさらに多くなる理由がわかりません。Florentが述べたように、andをストップワードとして扱い、これら重要でない単語の複数の一致が、本当に気になる単語の一致を圧倒しないようにすることができます。titlepriority += (title.match(rq).length)prioritypriority

(3)「このフレーズのすべての単語をこの正確な順序で」、「すべての単語を任意の順序で」、「これらの単語のいずれか」などのオプションを提供することをお勧めします。あなたは正しい方向に進んでおりeq、単語の境界で一致しています。または、ある種のステミングまたはワイルドカード構文を明示的にサポートして、たとえば、intro "はIntroductionと一致しますが、 introは一致しないようにすることができます。

アップデート

「すべての単語を任意の順序で」実装するのは簡単です。これを考えすぎているかもしれません。このスニペットは、すべてがまたはのいずれかで見つかった場合に設定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

最初にできることは、、、、、、、など一般な単語を無視することです。

たぶん、キーワードはタイトルよりも重要なはずです。

于 2012-08-01T12:09:15.273 に答える