سؤال

باستخدام Google Appengine DataStore، هل هناك طريقة لإجراء استعلام GQL تحدد جملة أين توجد بنمط StringProperty غير حساس للحالة؟ أنا لست متأكدا دائما ما هي الحالة التي ستكون فيها القيمة. تحدد المستندات أن المكان المناسب حساس لحالة القيم، هل هناك طريقة لجعل هذا غير حساس؟

على سبيل المثال، سيكون نموذج DB هذا:

from google.appengine.ext import db
class Product(db.Model):
    id = db.IntegerProperty()
    category = db.StringProperty()

والبيانات تبدو وكأنها هذه:

id         category
===================
1          cat1
2          cat2
3          Cat1
4          CAT1
5          CAT3
6          Cat4
7          CaT1
8          CAT5

أود أن أقول

gqlstring = "WHERE category = '{0}'".format('cat1')
returnvalue = Product.gql(gqlstring)

و لدي returnvalue يحتوي

id         category
===================
1          cat1
3          Cat1
4          CAT1
7          CaT1
هل كانت مفيدة؟

المحلول

لا أعتقد أن هناك مشغل من هذا القبيل في مؤخرة البيانات.

هل تتحكم في إدخال بيانات الفئة؟ إذا كان الأمر كذلك، فيجب عليك اختيار نموذج Enonical لتخزينه (كل الأحرف الصغيرة أو الأحرف الكبيرة). إذا كنت بحاجة إلى تخزين الحالة الأصلية لسبب ما، فيمكنك تخزين أعمدة - واحدة مع الأصل، واحد مع واحد موحدة. وبهذه الطريقة يمكنك القيام بند طبيعي حيث.

نصائح أخرى

لا تدعم Datastore مقارنات غير حساسة للحالة، لأنك لا تستطيع فهرسة الاستعلامات التي تستخدمها (باستثناء فهرس يحول القيم). الحل هو تخزين نسخة طبيعية من السلسلة الخاصة بك بالإضافة إلى المعيار واحد، كما يوحي بيتر. فصول العقارات في aetycon قد تثبت المكتبة مفيدة، على وجه الخصوص، derivedproperty.

كان هذا الخيط مفيدا ويجعلني أرغب في المساهمة بنهج مماثل لإجراء مباراة بحث جزئية ممكنة. أقوم بإضافة حقل آخر في نوع Datastore وحفظ كل كلمة على العبارة التكلفة كتعدد ثم استخدمها في تصفية للتصادم. هذا مثال مع عباءة. يجب أن يترجم الجزء التطبيع من السهل إلى Java على الأقل (بفضل Raek على # Clojure)، في حين يجب أن يكون تفاعل قاعدة البيانات قابلة للتحويل إلى أي لغة:

(use '[clojure.contrib.string :only [split lower-case]])
(use '[appengine-magic.services.datastore :as ds])

; initialize datastore kind entity
(ds/defentity AnswerTextfield [value, nvalue, avalue]) 

; normalize and lowercase a string
(defn normalize [string-to-normalize]
  (lower-case
    (apply str
      (remove #(= (Character/getType %) Character/NON_SPACING_MARK)
               (java.text.Normalizer/normalize string-to-normalize java.text.Normalizer$Form/NFKD)))))

; save original value, normalized value and splitted normalized value
(defn textfield-save! [value]
  (ds/save! 
    (let [nvalue (normalize value)]
      (ds/new* AnswerTextfield [value nvalue (split #" " nvalue)]))))

; normalized search
(defn search-normalized [value]
  (ds/query :kind AnswerTextfield
            :filter [(= :nvalue (normalize value))]))

; partial normalized word search
(defn search-partial [value]
  (flatten
    (let [coll []]
      (for [splitted-value (split #" " (normalize value))]
        (merge coll 
          (ds/query :kind AnswerTextfield
                    :filter [(in :avalue [splitted-value])]))))))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top