سؤال

وأنا باستخدام وظيفة العرض التالي لتكرار عبر كافة العناصر الموجودة في قاعدة البيانات (من أجل العثور على علامة)، ولكن أعتقد أن أداء ضعيف جدا إذا ورقة العمل كبير. أي نهج آخر؟

def by_tag(tag):
return  '''
        function(doc) {
            if (doc.tags.length > 0) {
                for (var tag in doc.tags) {
                    if (doc.tags[tag] == "%s") {
                        emit(doc.published, doc)
                    }
                }
            }
        };
        ''' % tag
هل كانت مفيدة؟

المحلول

تنويه: لم أكن اختبار هذا ولا أعرف ما إذا كان يمكن أن تؤدي أفضل

وإنشاء طريقة عرض بيرم واحد:

function(doc) {
  for (var tag in doc.tags) {
    emit([tag, doc.published], doc)
  }
};

والاستعلام مع _view / your_view / كل شيء؟ startkey = [ 'your_tag_here'] وendkey = [ 'your_tag_here'، {}]

والناتجة بنية JSON ستكون مختلفة قليلا ولكن سوف لا يزال الحصول على موعد الفرز نشر.

نصائح أخرى

ويمكنك تحديد وجهة نظر دائم واحد، كما يقترح بهادر. عندما تفعل هذا النوع من الفهرسة، على الرغم من لا انتاج وثيقة لكل مفتاح. بدلا من ذلك، تنبعث منها ([العلامة، doc.published]، فارغة). في الإصدارات الحالية الافراج كنت بعد ذلك للقيام بحث منفصل لكل وثيقة، ولكن SVN جذع لديها الآن الدعم لتحديد "include_docs = صحيح" في سلسلة الاستعلام، وسوف كاوتش دي بي دمج تلقائيا المستندات إلى وجهة نظركم بالنسبة لك، دون الحمل مساحة.

وأنت كثيرا على الطريق الصحيح مع وجهة النظر. قائمة من الأفكار على الرغم من:

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

وسوف ينبعث منها مستند بأكمله ابطاء الامور. يجب أن تنبعث منها فقط ما هو ضروري لاستخدام طريقة العرض.

ولست متأكدا ما فال == "٪ ليالي" الأداء سيكون، ولكن يجب أن لا تتعدى اعتقد ان الامور. إذا كان هناك علامة مجموعة يجب أن تنبعث من العلامات. منحت إذا كنت تتوقع مجموعة العلامات التي سوف تحتوي على غير السلاسل، ثم تجاهل هذا.

# Works on CouchDB 0.8.0
from couchdb import Server # http://code.google.com/p/couchdb-python/

byTag = """
function(doc) {
if (doc.type == 'post' && doc.tags) {
    doc.tags.forEach(function(tag) {
        emit(tag, doc);
    });
}
}
"""

def findPostsByTag(self, tag):
    server = Server("http://localhost:1234")
    db = server['my_table']
    return [row for row in db.query(byTag, key = tag)]

والخريطة وظيفة byTag ترجع البيانات مع كل علامة فريدة من نوعها في "مفتاح"، ثم كل وظيفة مع أن العلامة في value، وذلك عندما كنت انتزاع مفتاح = "mytag"، فإنه سيتم استرداد كافة المشاركات مع "mytag" علامة .

ولقد اختبرت ذلك مقابل حوالي 10 مداخل ويبدو أن يستغرق حوالي 0.0025 ثانية لكل سؤال، ولست متأكدا مدى كفاءة هو الحال مع مجموعات البيانات الكبيرة ..

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