كيف أقوم بإجراء استعلام ذو معلمات على CouchDB

StackOverflow https://stackoverflow.com/questions/1203071

  •  05-07-2019
  •  | 
  •  

سؤال

أرغب في استخدام CouchDB لتخزين بعض البيانات لي ثم استخدام مكالمات RESTful API للحصول على البيانات التي أحتاجها.تسمى قاعدة البيانات الخاصة بي "اختبار" وجميع المستندات الخاصة بي لها بنية مماثلة وتبدو كما يلي (حيث يكون hello_world هو معرف المستند):

"hello_world" : {"id":123, "tags":["hello", "world"], "text":"Hello World"}
"foo_bar" :{"id":124, "tags":["foo", "bar"], "text":"Foo Bar"} 

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

http://localhost:5984/test/_design/search/_view/search_view?key="مرحبًا"

لكن هذا لا يسمح لي بالسماح للمستخدمين بتحديد سلسلة الاستعلام الخاصة بهم.على سبيل المثال، ماذا لو بحثوا عن "hello World".يجب أن أقوم باستفسارين:واحد لـ "hello" وواحد لـ "world" ثم سأضطر إلى كتابة مجموعة من جافا سكريبت لدمج النتائج وإزالة التكرارات وما إلى ذلك (YUCK!).ما أريده حقًا هو أن أكون قادرًا على القيام بشيء مثل هذا:

http://localhost:5984/test/_design/search/_view/search_view?term="مرحبا بالعالم"

ثم استخدم المعلمة "hello World" في وظائف خريطة/تقليل طرق العرض للعثور على جميع المستندات التي تحتوي على كل من "hello" و"world" في مجموعة العلامات.هل هذا النوع من الأشياء ممكن حتى مع CouchDB؟هل هناك طريقة أخرى لتحقيق ذلك داخل وجهة نظر لا أفكر فيها؟

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

المحلول

لا تدعم طرق عرض CouchDB البحث متعدد الأوجه أو البحث عن النص الكامل أو تقاطع النتائج.يتيح لك البرنامج المساعد Couchdb-lucene القيام بكل هذه الأشياء.

http://github.com/rnewson/couchdb-lucene/tree/master

نصائح أخرى

وتقنيا وهذا ممكن إذا كنت تنبعث منها لكل وثيقة كل مجموعة من باورسيت من العلامات وثيقة كمفتاح. يجب أن يؤمر العنصر مجموعة رئيسية والاستعلام الخاص بك whould يكون الاستعلام العلامات أمرت، أيضا.

function map(doc) {
  function powerset(array) { ... }

  powerset_of_tags = powerset(doc.tags)
  for(i in powerset_of_tags) {
    emit(powerset_of_tags[i], doc);
  }
}

ول{"hello_world" : {"id":123, "tags":["hello", "world"], "text":"Hello World"} ثيقة هذا من شأنه أن تنبعث منها:

{ key: [], doc: ... }
{ key: ['hello'], doc: ... }
{ key: ['world'], doc: ... }
{ key: ['hello', 'world'], doc: ... }

وعلى الرغم من أن يكون هذا ممكنا وأود أن تنظر هذا الحل arkward إلى حد ما. أنا لا أريد أن نتصور استخدام القرص من العرض للحصول على عدد أكبر من العلامات. وأتوقع أن عدد المفاتيح المنبعثة أن تنمو مثل 2 ^ ن.

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