Elasticsearch: تتسبب حقول القيمة الخالية في الاستعلامات custom_score في حدوث أخطاء "لا يوجد حقل"

تم إنشاؤها على ٩ فبراير ٢٠١١  ·  5تعليقات  ·  مصدر: elastic/elasticsearch

يبدو أن هناك مشكلة عند استخدام استعلامات custom_score ومحاولة تسجيل النقاط بناءً على الحقول التي يمكن أن تحتوي على قيم فارغة.

نظرا لدي:

{"user": {"name": "John", "position": null}}

عندما أستعلم باستخدام custom_score ونص مثل:

{"script": "_score + doc['position'].value"}

أحصل على الخطأ التالية:

ElasticSearchIllegalArgumentException[No field found for [position]]; }]

إذا أضفت مستخدمًا آخر:

{"user": {"name": "Jane", "position": 1}}

كل شيء يعمل بشكل جيد.

أعتقد أن السلوك الافتراضي يجب أن يكون لحقول القيمة الخالية لإرجاع قيمة خالية - وليس رفع خطأ.

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

التعليق الأكثر فائدة

يجب أن يعمل هذا:

{"script": "_score + (doc.containsKey('position') ? doc['position'].value : 0)"}

أو ربما هذا:

{"script": "_score + (doc['position'] ? doc['position'].value : 0)"}

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

ال 5 كومينتر

أوه - وشكرا على منتج رائع! :-)

هييا ،

يحدث هذا لأن هذا الحقل لم يتم تقديمه بعد (له قيمة فارغة). بمجرد تقديمه (بقيمة واحدة ، في الكتلة) ، فسوف يعمل بشكل جيد. يمكنك أيضًا تحديد null-value في التعيينات التي ستفهرس قيمة فارغة محددة عندما يكون هذا الحقل null . نظرًا لأنه لم يتم تقديمه ، فلا يمكن اشتقاق نوعه.

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

على سبيل المثال:

{"script": "_score + (doc['position'].present ? doc['position'] : 0)"}

يجب أن يعمل هذا:

{"script": "_score + (doc.containsKey('position') ? doc['position'].value : 0)"}

أو ربما هذا:

{"script": "_score + (doc['position'] ? doc['position'].value : 0)"}

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

خطأ فادح: لم يتم اكتشافه [NoFieldFound] لم يتم العثور على حقل: Contact._PloiciesLastApplicationDate0 المحاولة: 1 مرة (مرات). القيت

أتلقى الخطأ التالي أثناء تحديث جهة الاتصال.

على سبيل المثال: -

$ checkExist = Infusionsoft_DataService :: query (new Infusionsoft_Contact () ، صفيف ('Phone1' => '(618) -795-0304')) ؛

أنا أحضر جهة الاتصال وأحدّث جهة الاتصال بناءً على رقم الهاتف ، ولكن هل أعطي هذا الخطأ؟

شكرا!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات