سؤال

لدي جدول MySQL يحتوي على 40 مليون سجل يتم تعبئتها بواسطة عملية لم يكن لدي أي سيطرة. تتم إضافة البيانات مرة واحدة فقط كل شهر. يحتاج هذا الجدول إلى أن يكون البحث عن عمود الاسم. لكن عمود الاسم يحتوي على الاسم الكامل بالتنسيق "آخر في منتصف".

في sphinx.conf، لدي

sql_query = SELECT Id, OwnersName,
substring_index(substring_index(OwnersName,' ',2),' ',-1) as firstname, 
substring_index(OwnersName,' ',2) as lastname
FROM table1

كيف يمكنني استخدام SPHINX البحث للبحث عن طريق الاسم الأول و / أو اسم العائلة؟ أود أن أكون قادرا على البحث عن "سميث" في الاسم الأول فقط؟

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

المحلول

اذا حكمنا من خلال الإجابات الأخرى، ربما فاتني شيئا ... ولكن لتقييد البحث في أبو الهول إلى حقل معين، تأكد من أنك تستخدم وضع المطابقة الموسعة (أو الموسعة 2)، ثم استخدم سلسلة الاستعلام التالية: @firstname Smith.

نصائح أخرى

وظائف كل صف في استعلامات SQL هي دائما فكرة سيئة بالنسبة للجداول التي قد تنمو كبيرة. إذا كنت ترغب في البحث في جزء من العمود، فيجب استخراج العمود الخاص به وفهرستها.

أود أن أقترح، إذا كان لديك قوة على المخطط (بدلا من العملية السكانية)، إدراج أعمدة جديدة تسمى OptionFirstName واسملاك اسماء إلى جانب التحديث / إدراج الزناد الذي يستخرج المعلومات ذات الصلة من الملاك والشعب الأعمدة الجديدة بشكل مناسب.

هذا يعني أن حساب معرفة الاسم الأول يتم فقط عند تغيير الصف، وليس في كل مرة قمت بتشغيل استفسارك. هذا هو الوقت المناسب للقيام بذلك.

ثم تصبح استفساراتك بسرعة عمياء. ونعم، هذا يكسر 3NF، ولكن معظم الناس لا يدركون أنه من الجيد القيام بذلك لأسباب الأداء، شريطة أن تفهم العواقب. وبما أن الأعمدة الجديدة تسيطر عليها المشغلات، فإن ازدواجية البيانات التي ستكون سببا للقلق هي "نظيفة".

معظم المشاكل التي لدى الناس مع قواعد البيانات هي سرعة استفساراتهم. تضيع القليل من مساحة القرص لاكتساب كمية كبيرة من تحسين الأداء عادة ما يكون بخير.

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

يمكنك استخدام Substring للحصول على أجزاء من الحقل الذي تريد البحث فيه، ولكن هذا سيبطء العملية. لا يمكن للاستعلام استخدام أي نوع من الفهرس للقيام بالمقارنة، لذلك يجب عليه لمس كل سجل في الجدول.

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

هذا problrm مستعصية لأن أسماء كاملة يمكن أن تحتوي على بادئات ومعاطفا وأسماء متوسطة ولا أسماء متوسطة وأسماء أول وأخير مع وبدون الواصلات، وما إلى ذلك. لا توجد طريقة معقولة للقيام بذلك مع موثوقية 100٪

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