私はjavascriptで高度な検索をしたいと思います。どうやって?

私は基本的な、大文字と小文字を区別し、次のコードで検索用語を特定しました。それは今のところうまくいくが、私は何かを望むだろう(重要性の順に):

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

2:検索クエリが「検索語」で、検索された文字列が「検索語句」である場合をヒットします。

3:より多くのヒットを検出した後でも、文字列全体を検索します。

The purpose is to search a

tag with a specific id for a term. If it has it then display it. Ultimately, I will use this in a loop that will search many

tags and display the ones with hits and leave hidden the ones without.

コード:

<!DOCTYPE HTML>
<html>
    <body>
        
Click the button to locate where in the string a specifed value occurs.

Hello world, welcome to the universe.

<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>
2
nl ru de
"toLowerCaseはオプションではなく、同じものではありません"なぜそうではありませんか?
追加された 著者 PeeHaa,
@fredsbend実際には、テキストを正規化することはありません。そしてそれの美しさは、キーワードと検索件名の両方でそれを行います。大文字と小文字を区別しない検索を行います:)
追加された 著者 PeeHaa,
これはJavaScriptのタスクではありません。あなたが望むことをするためには、自然言語処理を使う必要があります。私はあなたの入力文字列をトークン化し、接尾辞を取り除くことから始めます。そこから、あなたのデータベースを検索しようとすることができます。
追加された 著者 Blender,
この種のものは通常クライアント側では行われません。 Javaには、使用できる自然言語処理ライブラリが豊富に用意されていますが、急な学習曲線があります。
追加された 著者 Blender,
私はいくつかのJavaを知っている。アプレットはこれを処理できますか?
追加された 著者 fredsbend,
toLowerCaseは、検索された文字列の大文字小文字が不明なので、役に立たない検索語を変更します。 toLowerCaseはテキストを正規化することです。
追加された 著者 fredsbend,
@Blenderこれらのライブラリのリンクとその使い方はありますか?
追加された 著者 fredsbend,
@PeeHaaとRichard Marrありがとう。私は脳のおならがあったと思う。両方でLowCaseを使うとは思わなかった。大文字と小文字を区別する問題は解決します。
追加された 著者 fredsbend,
@fredsbendでは、両方の入力、インデックス付きテキスト、およびクエリテキストでtoLowerCaseを使用する必要があります。これは難しい問題であり、解決したり回避したりする各問題は、抽象が漏れて赤ちゃんのように泣くまで別の問題に置き換えられることに注意してください。あなたがJavaを知っているなら、インスピレーションのためのLuceneのコードベースを見てください(本もあります)。
追加された 著者 Richard Marr,

3 答え

あなたの入力文字列をトークン化することから始めます:

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

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

これは本当に簡単な例であり、多数のコーナーケースを処理することはできませんが、少なくともキーワードを使って検索する方法は多少あります。

3
追加された
@Cerbrus:そして 'running' - > 'runn' 。例外のリストはちょうど繰り返されます。
追加された 著者 Blender,
remove_suffix( 'string') - > "str" の例を挙げてみましょう。それでも、残りの人には良い答えですから、+1してください。
追加された 著者 Cerbrus,

これは、いくつかの微調整で、私が信じるあなたの要求を満たす必要があります。 バックエンドでこれを行う方が良いかもしれません(=)。

// 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.

borrowed from here

2
追加された
だけでなく、ディスク上にもこのサーバー側が必要ですか?私はこれを詳しく見ていきます。ありがとう
追加された 著者 fredsbend,

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

Here is a: link

お役に立てれば

0
追加された
これまでは、大文字と小文字を区別しない方法を知ることができます。私は確かにそれを使用します。元の投稿でアイテム2をどのように解決するかを見てみましょう。元の投稿でアイテム3を解決する方法はよく分かりません。
追加された 著者 fredsbend,
つまり、グループとグローバル検索(タグ/ g)を使用することができます。もっと答えを得るために、これを読むことができます: stackoverflow.com/questions/520611/…
追加された 著者 Mark Bramnik,
JavaScript - 日本のコミュニティ
JavaScript - 日本のコミュニティ
2 参加者の

日本人コミュニティのjavascript