この方法でSQLiteオーダーを実行するにはどうすればよいのでしょうか。
select * from contacts order by jarowinkler(contacts.name,'john smith');
Androidにはユーザー定義関数のボトルネックがあることを知っていますが、代替手段はありますか?
この方法でSQLiteオーダーを実行するにはどうすればよいのでしょうか。
select * from contacts order by jarowinkler(contacts.name,'john smith');
Androidにはユーザー定義関数のボトルネックがあることを知っていますが、代替手段はありますか?
文字列の長さを事前に計算し、それらを別の列に追加します。次に、テーブル全体をその長さで並べ替えます。インデックスを追加します(可能な場合)。次に、「SrivastavaBrahmaputra」と「JohnSmith」を比較したくない場合などに、フィルターを追加します。長さはあまりにもひどいので、全長のパーセンテージとして長さによるこれらの種類の比較を除外します。したがって、単語が10文字の場合は、10+-2または10+-3文字の単語とのみ比較してください。
このようにして、このアルゴリズムを実行する必要がある回数を大幅に減らすことができます。
通常、100 000エントリの語彙では、このようなフィルターは比較の数を約300に減らします。本格的なレコードリンケージを行っている場合を除いて、なぜAndroidを使用するのでしょうか。それでも確率的手法を適用してスコアを計算する必要がありますが、これはAndroidの仕事ではありません(少なくとも今のところはそうではありません)。
また、MS SQL Serverでは、CLR関数にラップされたJaro Winkler文字列の距離のパフォーマンスが大幅に向上します。これは、SQL Serverがネイティブにサポートされておらず、処理の多くが配列に関連しているためです。そのため、T-SQLでの実装ではオーバーヘッドが大きくなりすぎますが、SQL-CLRは非常に高速に動作します。
ステップ #1: クエリからそのORDER BY部分を引いたものを実行する
ステップ #2:CursorWrapperをラップする を作成し、各位置の Jaro-Winkler 距離を計算し、位置を並べ替えてから、位置を必要とするすべてのメソッド (たとえば、 、 )Cursorをオーバーライドするときに並べ替えられた位置を使用します。moveToPosition()moveToNext()