استخدام SOUNDEX () كلمة كلمة على SQL Server
-
20-09-2019 - |
سؤال
وهنا هو مشكلتي. على سبيل المثال لدي الجدول <م> المنتجات م> يحتوي على حقل، <م> اسم م>:
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:
نصائح أخرى
وبدلا من استخدام SOUNDEX كنت قد يكونون أفضل حالا حساب المسافة Levenshtein بين السلسلتين. انظر في مقالة ويكيبيديا على مسافة Levenshtein .
وهناك تنفيذ TSQL المسافة Levenshtein خوارزمية هنا .
وحصة والتمتع بها.
وتحرير 03 مايو 2012
ومنذ كتابة ردي الأصلية تعلمت أن أوراكل يتضمن مسافة Levenshtein والعديد غيرها من وظائف "سلسلة تشابه" في حزمة UTL_MATCH، التي أعتقد أنها جزء أساسي من قاعدة البيانات. وثائق هنا . ربما لا علاقة مباشرة لهذا المنصب الأصلي (الذي كان ل SQL Server)، ولكن ربما من المفيد كما تستخدم العديد من المحلات التجارية قواعد بيانات متعددة.
إذا كان لديك لتفعل كل شيء في RDBMS، و UDF سيكون أفضل إذا كان خيار.
وعلى خلاف ذلك، هل يمكن استخدام هذه التقنية على الأقل SOUNDEX الكلمات الأربع الأولى تستخدم بشكل فردي <لأ href = "http://msdn.microsoft.com/en-us/library/ms188006.aspx" يختلط = "noreferrer نوفولو "> PARSENAME :
كيف يمكنني تقسيم سلسلة حتى أتمكن من الوصول إلى البند العاشر؟ أ >:
PARSENAME(REPLACE('12 inches laptop computer', ' ', '.'), 1) --return computer
PARSENAME(REPLACE('12 inches laptop computer', ' ', '.'), 2) --return laptop
...
ولكن: استخدام PARSENAME بهذه الطريقة هو الإختراق وقيدا خطيرا هو أنها لا تعمل إلا لماكس من 4 أجزاء. إذا كان هناك 5 أو أكثر من الكلمات PARSENAME سيعود NULL، بحيث يكون لديك للتحقق من ذلك مع شرط وتحط بأمان.
وهنا مثال مبسط (مرة أخرى، من دون شيكات NULL)
SELECT *
FROM Products
WHERE SOUNDEX(search_input) = SOUNDEX(PARSENAME(REPLACE(Name, ' ', '.'), 4))
OR SOUNDEX(search_input) = SOUNDEX(PARSENAME(REPLACE(Name, ' ', '.'), 3))
OR SOUNDEX(search_input) = SOUNDEX(PARSENAME(REPLACE(Name, ' ', '.'), 2))
OR SOUNDEX(search_input) = SOUNDEX(PARSENAME(REPLACE(Name, ' ', '.'), 1))
قد يكون 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 يعمل فقط مع اللغة الإنجليزية. يعمل مزود أعلاه جيدا بدلا من ذلك على عدد من المواقع.