سؤال

وهنا هو مشكلتي. على سبيل المثال لدي الجدول <م> المنتجات يحتوي على حقل، <م> اسم :

Products
ID | Name | ..
1  | "USB Key 10Go"
2  | "Intel computer"
3  | "12 inches laptop computer"
...

وأنا حاليا بتنفيذ محرك بحث بسيط (SQL Server و ASP .NET، C #) للحصول على اي فون التطبيق على شبكة الإنترنت، وأود أن استخدام وظيفة SOUNDEX() SQL خادم.

والشيء هو، وأنا لا يمكن استخدامها مباشرة SOUNDEX على اسم المجال. (وهذا من شأنه أن يكون غير ذي صلة لأن هناك العديد من الكلمات في الاسم.) وأود أن تطبيق وظيفة SOUNDEX إلى كل كلمة من <م> اسم المجال، ومن ثم معرفة ما إذا كان أي منها يطابق الكلمة بحثها.

إذا كان لدى أي شخص فكرة عن كيفية القيام بذلك، التي من شأنها أن تكون رهيبة.

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

المحلول

هل بدا في كامل النص ميزة البحث في SQL Server؟ أعرف أن هذا ليس بالضبط ما الذي طلب. لمجرد أن يتم استخدام الدالة SOUNDEX () لتجد أسماء السبر مماثلة (EX: SMITH وسميث الصوت نفسه). في محرك البحث، ولكن، كيف تبدو كلمة أقل أهمية من البحث عن الكلمات نفسها. نص كامل بحث أيضا يتيح لك استخدام المرادفات (مما يسمح لك لتحديد بعض الكلمات التي تعني الشيء نفسه ضمن سياق التطبيق الخاص بك)، ويكون لهم يعتبر تلقائيا أثناء بحثك.

وانظروا الى هذه الصفحات لمزيد من المعلومات حول بحث النص الكامل في SQL Server:

مقدمة إلى كامل نص ابحث

CONTAINS

CONTAINSTABLE

FREETEXT

FREETEXTTABLE

نصائح أخرى

وبدلا من استخدام SOUNDEX كنت قد يكونون أفضل حالا حساب المسافة Levenshtein بين السلسلتين. انظر في مقالة ويكيبيديا على مسافة Levenshtein .

وهناك تنفيذ TSQL المسافة Levenshtein خوارزمية هنا .

وحصة والتمتع بها.


وتحرير 03 مايو 2012

ومنذ كتابة ردي الأصلية تعلمت أن أوراكل يتضمن مسافة Levenshtein والعديد غيرها من وظائف "سلسلة تشابه" في حزمة UTL_MATCH، التي أعتقد أنها جزء أساسي من قاعدة البيانات. وثائق هنا . ربما لا علاقة مباشرة لهذا المنصب الأصلي (الذي كان ل SQL Server)، ولكن ربما من المفيد كما تستخدم العديد من المحلات التجارية قواعد بيانات متعددة.

قد يكون SOUNDEX حلا مثاليا لpurpuse الخاص بك، ولكن تذكر أنه قد لا توفر نتائج جيدة لأي شيء آخر من الكلمات المنطوقة الإنجليزية البريطانية أو الأمريكية! بل قد تكون استخدامه على الكلمات المنطوقة الصوتى الألمانية، لكنها لن تعمل بشكل جيد مع أي شيء آخر.

هل يمكن أن تحاول تخزين metaphone من كل كلمة متصلا مع الواصلات. يمكن أن تحتوي EG الحقل stored_metaphone شيء من هذا القبيل "-AKTRF-SPLS-. ثم بناء استعلام مثل هذا:

$where = '(';
$search_sql = array();
$search_terms = explode(' ',$search);
foreach ($search_terms as $term) {
    $search_sql[] = "`stored_metaphone` LIKE '%-".metaphone($term)."-%'";
}
$where .= implode(' OR ',$search_sql);
$where .= ')';

وNB هذا ليس سوى جزء WHERE الاستعلام.

وبقدر ما أعرف metaphone يعمل فقط مع اللغة الإنجليزية. يعمل مزود أعلاه جيدا بدلا من ذلك على عدد من المواقع.

scroll top