سؤال

أتساءل كيف يمكنني تشغيل أمر sqlite بهذه الطريقة

select * from contacts order by jarowinkler(contacts.name,'john smith');

أعلم أن Android لديه عنق الزجاجة مع وظائف محددة للمستخدم ، هل لدي بديل؟

هل كانت مفيدة؟

المحلول

الخطوة رقم 1: هل الاستعلام ناقص ORDER BY جزء

الخطوة رقم 2: إنشاء أ CursorWrapper هذا يلتف الخاص بك Cursor, ، يحسب مسافة Jaro-Winkler لكل موضع ، وفرز المواضع ، ثم يستخدم المواضع المرتبة عند تجاوز جميع الطرق التي تتطلب موضعًا (على سبيل المثال ، moveToPosition(), moveToNext()).

نصائح أخرى

قبل حساب أطوال السلسلة وإضافتها إلى عمود منفصل. ثم فرز الجدول من قبل ذلك الطول. إضافة فهارس (إذا كنت تستطيع). ثم أضف مرشحات إضافية على سبيل المثال لا تريد مقارنة "Srivastava Brahmaputra" إلى "John Smith". الطول خارج عن طريق الكثيرة للغاية ، لذا يستبعد هذا النوع من المقارنة حسب الطول كنسبة مئوية من الطول الإجمالي. لذلك إذا كانت كلمتك 10 أحرف تقارنها فقط بالكلمات ذات الأحرف 10+-2 أو 10+-3.

وبهذه الطريقة ، سوف تقلل بشكل كبير من عدد المرات التي تحتاج فيها هذه الخوارزمية إلى تشغيلها.

عادةً ما تقلل مثل هذه المرشحات من 100000 إدخالات من عدد المقارنات إلى حوالي 300. ما لم تقم برابط سجل كامل في مهب ، وبعد ذلك أتساءل لماذا استخدام Android لذلك. ستظل بحاجة إلى تطبيق طرق احتمالية لذلك وحساب الدرجات ، وهذه ليست مهمة لنظام Android (على الأقل ليس الآن).

أيضًا في MS SQL Server Jaro Winkler String Distate ملفوفة في وظيفة CLR ، أداء أفضل بكثير ، لأن SQL Server لا يفسد Arays أصليًا والكثير من المعالجة حول المصفوفات. لذا فإن التنفيذ في T-SQL يضيف الكثير من النفقات العامة ، لكن SQL-Clr يعمل بسرعة كبيرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top