jaro-winkler distanceアルゴリズムを使用して注文しますか?
-
27-09-2019 - |
質問
この方法でどのようにしてsqlite注文を実行できるのだろうかと思っています
select * from contacts order by jarowinkler(contacts.name,'john smith');
Androidには、ユーザー定義の関数が付いたボトルネックがあることを知っていますが、代替手段はありますか?
解決
ステップ#1:クエリを引いた ORDER BY
部分
ステップ#2:aを作成します CursorWrapper
それはあなたを包みます Cursor
, 、各位置のJaro-Winkler距離を計算し、位置をソートし、位置を必要とするすべての方法をオーバーライドするときにソートされた位置を使用します(例: moveToPosition()
, moveToNext()
).
他のヒント
文字列の長さを事前に計算し、個別の列に追加します。次に、その長さでエントレッドテーブルを並べ替えます。インデックスを追加します(可能であれば)。次に、「Srivastava Brahmaputra」と「John Smith」と比較したくない場合、追加のフィルターを追加します。長さはあまりにも大きすぎるため、全長の割合としての長さごとにこの種の比較を除外します。したがって、単語が10文字の場合、10+-2または10+-3文字の単語とのみ比較してください。
これにより、このアルゴリズムが実行する必要がある回数を大幅に削減します。
通常、100 000のエントリのボーカルビュラリーでは、このようなフィルターは約300に比較数を減らします。完全に吹き飛ばされたレコードリンケージを行っていない限り、なぜAndroidを使用するのだろうと思います。そのために確率的方法を適用してスコアを計算する必要がありますが、これはAndroidの仕事ではありません(少なくとも今はそうではありません)。
また、SQL ServerにラップされたMS SQL Serverでは、CLR関数にラップされたJaro Winkler String距離は、SQL Serverがネイティブにサポートせず、処理の多くが配列周辺にあるため、パフォーマンスがはるかに向上しています。したがって、T-SQLでの実装はオーバーヘッドが多すぎますが、SQL-CLRは非常に速く動作します。