25

文字列が検索クエリに一致するかどうかを判断できるJavaScriptライブラリはありますか?それは効率的であり、GoogleやLexisNexisのような高度なクエリ機能(および/または演算子、同義語、括弧など)を提供する必要があります。どんな種類の高度な検索機能も素晴らしいでしょう。特定の検索エンジンと完全に一致する必要はありません。

動機:検索ボックスとそれに続く一連の段落(一意のIDを持ち、JavaScript配列から生成される)を含むHTMLページがあります。ユーザーがボックスに検索クエリを入力してEnterキーを押すと、クエリと一致しない場合はすべての段落を非表示にする(つまり、にdisplay設定する)必要があります。none

私の現在の戦略(jQueryを使用):

  1. クエリ文字列を空白で分割して、キーワードの配列に分割します。
  2. ですべての段落を非表示にし$('p').hide()ます。
  3. キーワードごとに、それを含む段落を。で表示し$('p:contains("'+keyword+'")').show()ます。

これは、大文字と小文字を区別し、すべてのキーワードをオプションとして扱い、、、、または括弧などandの演算子を提供しない、非常に限定された検索機能です。orまた、すでに一致している場合でも、キーワードごとに1回ずつ文字列を処理するため、非効率的です。

4

5 に答える 5

50

以下は、私がプロジェクト用に評価しているいくつかのライブラリです (2013 年 7 月)。これらのいずれも、検索機能の中核を提供できるはずです。

独自のステミング アルゴリズムを作成したい場合は、次の 2 つの一般的なステミング アルゴリズムの実装を参考にしてください。

ブール論理検索演算子の処理に関しては、js クエリ パーサーに関するこの質問が役立つかもしれません。

于 2013-07-08T21:41:42.953 に答える
4

最善の (簡単で良い) 方法は、ベクトル検索アルゴリズムを使用することです。

最初に各段落のすべての単語を取得し、それらをベクトル オブジェクトに保存し (ビルド方法は後で説明します)、関係を各段落ベクトルのクエリ ベクトルと比較します。

次に、各単語でPorter ステマーを使用して、kid や kids などをクラスター化します。

var Vector = function(phar) {

var self = this;
self.InitVector = function () {
    var wordArray = self.spltwords(phar);
    self.VectorSize = wordArray .length;
    var stemdWordArray = self.runPotterStemmer(wordArray);
    self.VectoData = self.GroupAndCountWords(stemdWordArray) ;
}
self.VectoData = {}; 

self.runPotterStemmer = function(arr){
    // run potter as seen in link
}

self.spltwords= function(arr) {
    // run split
}

self.GroupAndCountWords = function(arr) {
    for (var i=0; i<arr.length; i++) {
        if (VectoData[arr[i]] === undefined) {
            VectoData[arr[i]] = 0;     
        } else {
            VectoData[arr[i]] = VectoData[arr[i]] +1;        
        }
    }
}  
self.compare = function(queryVector) {
    // compare queryVector to current vector and return a similarity number
    // number of similar words count in query divided by the length of paragraph                       
}                        
self.InitVector()
return self;
于 2012-08-08T12:03:29.757 に答える