محرك تطبيقات جوجل:هل من الممكن إجراء استعلام Gql LIKE؟

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

سؤال

واحدة بسيطة حقا.في SQL، إذا كنت أرغب في البحث في حقل نصي عن بضعة أحرف، فيمكنني القيام بما يلي:

SELECT blah FROM blah WHERE blah LIKE '%text%'

لا تشير وثائق App Engine إلى كيفية تحقيق ذلك، ولكن من المؤكد أنها مشكلة شائعة بدرجة كافية؟

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

المحلول

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

بمعنى آخر، يجب أن يستخدم كل استعلام فهرسًا.لهذا السبب لا يمكنك إلا أن تفعل =, > و < الاستعلامات.(في الواقع يمكنك أيضًا القيام بذلك != لكن واجهة برمجة التطبيقات (API) تقوم بذلك باستخدام مزيج من > و < الاستعلامات.) ولهذا السبب أيضًا تراقب بيئة التطوير جميع الاستعلامات التي تجريها وتضيف تلقائيًا أي فهارس مفقودة إلى ملفك index.yaml ملف.

لا توجد طريقة للفهرسة لـ a LIKE استعلام لذلك فهو ببساطة غير متوفر.

هل لديك ساعة من جلسة Google IO هذه للحصول على شرح أفضل وأكثر تفصيلاً لهذا.

نصائح أخرى

أواجه نفس المشكلة، ولكنني وجدت شيئًا ما في صفحات محرك تطبيقات Google:

نصيحة:لا تحتوي مرشحات الاستعلام على طريقة واضحة لمطابقة جزء فقط من قيمة السلسلة، ولكن يمكنك تزوير مطابقة البادئة باستخدام مرشحات عدم المساواة:

db.GqlQuery("SELECT * FROM MyModel WHERE prop >= :1 AND prop < :2",
            "abc",
            u"abc" + u"\ufffd")

يطابق هذا كل كيان MyModel مع خاصية سلسلة تبدأ بالأحرف abc.تمثل سلسلة Unicode u"\ufffd" أكبر حرف Unicode ممكن.عندما يتم فرز قيم الخاصية في فهرس، فإن القيم التي تقع في هذا النطاق هي جميع القيم التي تبدأ بالبادئة المحددة.

http://code.google.com/appengine/docs/python/datastore/queriesandindexes.html

ربما هذا يمكن أن يفي بالغرض ;)

على الرغم من أن App Engine لا يدعم استعلامات LIKE، ألقِ نظرة على الخصائص ListProperty و StringListProperty.عند إجراء اختبار المساواة على هذه الخصائص، سيتم تطبيق الاختبار فعليًا على جميع أعضاء القائمة، على سبيل المثال، list_property = value اختبارات إذا كانت القيمة تظهر في أي مكان في القائمة.

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

تحتاج إلى استخدام خدمة البحث لإجراء استعلامات بحث عن النص الكامل مشابهة لـ SQL LIKE.

جيليك يوفر لغة خاصة بالمجال لأداء المزيد استعلامات بحث سهلة الاستخدام.على سبيل المثال، سيجد المقتطف التالي أول عشرة كتب مرتبة من أحدث الكتب التي تحتوي على عنوان fernوالنوع مطابق تمامًا thriller:

def documents = search.search {
    select all from books
    sort desc by published, SearchApiLimits.MINIMUM_DATE_VALUE
    where title =~ 'fern'
    and genre =  'thriller'
    limit 10
}

يتم كتابة الإعجاب كمشغل مطابقة Groovy =~.وهو يدعم وظائف مثل distance(geopoint(lat, lon), location) أيضًا.

أطلق محرك التطبيق للأغراض العامة خدمة البحث عن النص الكامل في الإصدار 1.7.0 الذي يدعم مخزن البيانات.

التفاصيل في إعلان.

مزيد من المعلومات حول كيفية استخدام هذا: https://cloud.google.com/appengine/training/fts_intro/lesson2

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

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

String start = "foo";
    ... = ofy.query(MyEntity.class).filter("field >=", start).filter("field <", start + "\uFFFD");

فقط اتبع هنا:init.py#354">http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/ext/search/فيه.py#354

إنها تعمل!

class Article(search.SearchableModel):
    text = db.TextProperty()
    ...

  article = Article(text=...)
  article.save()

To search the full text index, use the SearchableModel.all() method to get an
instance of SearchableModel.Query, which subclasses db.Query. Use its search()
method to provide a search query, in addition to any other filters or sort
orders, e.g.:

  query = article.all().search('a search query').filter(...).order(...)

لقد اختبرت هذا باستخدام Java API منخفض المستوى لـ GAE Datastore.لي ويعمل على أكمل وجه

    Query q = new Query(Directorio.class.getSimpleName());

    Filter filterNombreGreater = new FilterPredicate("nombre", FilterOperator.GREATER_THAN_OR_EQUAL, query);
    Filter filterNombreLess = new FilterPredicate("nombre", FilterOperator.LESS_THAN, query+"\uFFFD");
    Filter filterNombre =  CompositeFilterOperator.and(filterNombreGreater, filterNombreLess);

    q.setFilter(filter);

بشكل عام، على الرغم من أن هذا منشور قديم، فإن إحدى طرق إنتاج "LIKE" أو "ILIKE" هي جمع كل النتائج من استعلام ">="، ثم تكرار النتائج في python (أو Java) للعناصر التي تحتوي على ما تريد 'إعادة تبحث عنه.

لنفترض أنك تريد تصفية المستخدمين الذين لديهم q='luigi'

users = []
qry = self.user_model.query(ndb.OR(self.user_model.name >= q.lower(),self.user_model.email >= q.lower(),self.user_model.username >= q.lower()))

for _qry in qry:
 if q.lower() in _qry.name.lower() or q.lower() in _qry.email.lower() or q.lower() in _qry.username.lower():
      users.append(_qry)

ليس من الممكن إجراء بحث LIKE على محرك تطبيق مخزن البيانات، ولكن إنشاء قائمة Arraylist سيفي بالغرض إذا كنت بحاجة إلى البحث عن كلمة في سلسلة.

@Index
    public ArrayList<String> searchName;

ومن ثم البحث في الفهرس باستخدام objectify.

List<Profiles> list1 = ofy().load().type(Profiles.class).filter("searchName =",search).list();

وهذا سيعطيك قائمة بجميع العناصر التي تحتوي على العالم الذي قمت به في البحث

إذا LIKE '%text%' يقارن دائمًا بكلمة أو عدد قليل (فكر في التباديل) وتتغير بياناتك ببطء (يعني ببطء أنها ليست باهظة الثمن - سواء من حيث السعر أو من حيث الأداء - لإنشاء الفهارس وتحديثها) ثم قد يكون كيان فهرس العلاقة (RIE) الاجابة.

نعم، سيتعين عليك إنشاء كيان مخزن بيانات إضافي وتعبئته بشكل مناسب.نعم، هناك بعض القيود التي سيتعين عليك التلاعب بها (أحدها هو 5000 حد لطول خاصية القائمة في مخزن بيانات GAE).لكن عمليات البحث الناتجة تتم بسرعة البرق.

لمزيد من التفاصيل انظر بلدي RIE مع جافا وOjbectify و RIE مع بايثون دعامات.

غالبًا ما يتم استخدام كلمة "أعجبني" كبديل للبحث عن النص للرجل الفقير.للبحث عن النص، فمن الممكن استخدامها Whoosh-AppEngine.

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