2011-08-16 10 views
19

私の英語は大変申し訳ありません。IndexedDBファジー検索

私は入力ボックスに何かを入力すると示唆するWebプロジェクトで作業していますが、IndexedDBを使用してFirefoxのクエリ速度を向上させたいとします。 WebSQLで

私はこの文を持っている:

db.transaction(function (tx) { 
    var SQL = 'SELECT "column1", 
        "column2" 
      FROM "table" 
      WHERE "column1" LIKE ? 
      ORDER BY "sortcolumn" DESC 
      LIMIT 6'; 

    tx.executeSql(SQL, [searchTerm + '%'], function(tx, rs) { 
    // Process code here 
    }); 
}); 

は私がのIndexedDBと同じことをしたいと私はこのコードを持っている:

db.transaction(['table'], 'readonly') 
    .objectStore('table') 
    .index('sortcolumn') 
    .openCursor(null, 'prev') 
    .onsuccess = function (e) { 
    e || (e = event); 
    var cursor = e.target.result; 
    if (cursor) { 
     if (cursor.value.column1.substr(0, searchTerm.length) == searchTerm) { 
      // Process code here 
     } else { 
      cursor.continue(); 
     } 
    } 
}; 

をしかしそこにあまりにも遅いですし、私のコードにバグ..です私はこれを行うより良い方法があることを知りたいです。

ありがとうございます。

答えて

20

私はついにこの問題の解決策を見つけました。

解決策は、検索語と検索語の間のキー範囲をバインドし、最後に 'z'文字を付けることです。例:私たちはすべてのデータをロードしたとき、私は結果を注文する必要があるため、私はトランザクションの前に配列を定義し

db.transaction(['table'], 'readonly') 
    .objectStore('table') 
    .openCursor(
    IDBKeyRange.bound(searchTerm, searchTerm + '\uffff'), // The important part, thank Velmont to point out 
    'prev') 
    .onsuccess = function (e) { 
    e || (e = event); 
    var cursor = e.target.result; 
    if (cursor) { 
     // console.log(cursor.value.column1 + ' = ' + cursor.value.column2); 
     cursor.continue(); 
    } 
    }; 

が、その後、私たちはこのように、それを呼び出す:私は失っている

var result = []; 
db.transaction(['table'], 'readonly') 
    .objectStore('table') 
    .openCursor(
    IDBKeyRange.bound(searchTerm, searchTerm + '\uffff'), // The important part, thank Velmont to point out 
    'prev') 
    .onsuccess = function (e) { 
    e || (e = event); 
    var cursor = e.target.result; 
    if (cursor) { 
     result.push([cursor.value.column1, cursor.value.sortcolumn]); 
     cursor.continue(); 
    } else { 
     if (result.length) { 
     result.sort(function (a, b) { 
      return a[1] - b[2]; 
     }); 
     } 

     // Process code here 
    } 
    }; 
+0

ありがとう!これは、私にとっては3500msから140msに短縮されました。 – pimvdb

+0

@pimvdbあなたが役に立ったと知りました。結果をソートする例をいくつか追加しました。 –

+6

'\ uffff'をzではなくダガーとして使う方が良いでしょう。あなたは、 "wiki"を検索するときに "wikipædia"のような検索結果を得ることはありません。 –

3

私はIndexedDBを試していますが、私はそれが非常に遅いと判断し、APIの複雑さを追加しました。

実際にどれくらいのデータがあるかによって、実際にはメモリ内の検索を行う価値があります。次に、ある種のストレージからデータをマーシャリングまたはアンマーシャリングできます。より単純なlocalStorage。

+0

Internet ExplorerとFirefoxの場合、単純なXMLHttpRequestを使用する必要があります。これは、XHR + PHPがさらに高速であるためです。 WebSQLは標準であるといいでしょう。クライアントがWebアプリケーションを使用して効率を上げ、サーバーが長期的にリソースを節約するからです。 –

1

〜同じ問題で2時間と私は本当の問題を発見した。ここで

ソリューション:

  • prevIDBCursor.PREVを交換してください(それはひどいですが、これは解決策である)

IDBCursor.PREVは(26/02/2013)

クロームの瞬間に盗聴されます
+0

あなたが持っていた問題は、私と同じではありません。あなたの問題は、新しい仕様の変更(2013年2月20日更新)に起因します:https://dvcs.w3.org/hg/IndexedDB/raw-file/tip/Overview.html。 PS:新しい仕様に合わせて問題と私の答えを更新しました。 –

関連する問題