2

以下のコードを使用して、大文字と小文字を区別する基本的な用語固有の検索を行います。それは今のところうまくいくでしょうが、私は何かが欲しいです(重要度の順で):

1: 大文字と小文字を区別しない (つまり、"hi" と "Hi" はどちらも同じです。toLowerCaseオプションではなく、同じものではありません)

2:例として、検索クエリが「検索語」、検索文字列が「検索語」の場合にヒットします。

3: ヒットした後も文字列全体を検索し、さらにヒットします。

目的は、用語<p>に固有のタグを検索することです。idある場合は、それを表示します。最終的に、これをループで使用して、多くのタグを検索<p>し、ヒットしたタグを表示し、ヒットしなかったタグを非表示のままにします。

コード:

<!DOCTYPE html>
<html>
    <body>
        <p id="demo">Click the button to locate where in the string a specifed value occurs.</p>
        <p id="demo1" style="display:none;">Hello world, welcome to the universe.</p>
        <button onclick="myFunction()">Try it</button>

        <script>
            function myFunction() {
                var x = document.getElementById("demo1")
                var str = x.innerHTML.toString();
                var n = str.indexOf("welcome");
                if (n != -1) {
                    x.style.display = 'inline';
                } else {
                    x.innerHTML = 'Negative';
                    x.style.display = 'inline';
                }
            }
        </script>

    </body>
</html>
4

3 に答える 3

4

入力文字列をトークン化することから始めます。

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"]

ここで、クエリ文字列のキーワードが検索文字列のキーワードに含まれているかどうかを確認するだけです。

これは非常に単純な例であり、多数の特殊なケースを処理することはできませんが、少なくとも検索にキーワードを使用する方法がある程度わかります。

于 2012-12-28T11:16:44.570 に答える
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.

ここから借りた

于 2012-12-28T11:14:16.080 に答える
0

正規表現エンジンを見てください。学ぶのに少し時間がかかりますが、一度それを知ったら、おそらくここであなたの目標を達成するでしょう。

ここにあります:リンク

お役に立てれば

于 2012-12-28T11:00:35.860 に答える