Google App Engine: क्या Gql LIKE क्वेरी करना संभव है?


123

वास्तव में एक सरल। एसक्यूएल में, यदि मैं कुछ वर्णों के लिए एक पाठ क्षेत्र खोजना चाहता हूं, तो मैं यह कर सकता हूं:

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

ऐप इंजन के लिए प्रलेखन यह कैसे प्राप्त करने के बारे में कोई उल्लेख नहीं करता है, लेकिन निश्चित रूप से यह एक सामान्य पर्याप्त समस्या है?


3
निरंतर समस्या GAE Datastore का उपयोग करने की कोशिश कर रहे लोगों के आसपास घूमती है जैसे कि यह एक संबंधपरक / ~ SQL डेटाबेस था। Google द्वारा GQL शुरू करने से, यह लोगों को SQL सिस्टम के संदर्भ में सोच में ले जाता है। हालाँकि मैं समझता हूं कि Google सभी के लिए संक्रमण को आसान बनाने की कोशिश कर रहा है, हालांकि मुझे यकीन नहीं है कि यह सही तरीका है।
23

जवाबों:


81

बिगटेबल, जो ऐप इंजन के लिए डेटाबेस बैक एंड है, लाखों रिकॉर्ड बनाएगा। इसके कारण, ऐप इंजन आपको किसी भी क्वेरी को करने की अनुमति नहीं देगा, जिसके परिणामस्वरूप टेबल स्कैन होगा, क्योंकि प्रदर्शन अच्छी तरह से आबादी वाली तालिका के लिए भयानक होगा।

दूसरे शब्दों में, प्रत्येक क्वेरी को एक इंडेक्स का उपयोग करना चाहिए। यही कारण है कि आप केवल कर सकते हैं =, >और <प्रश्नों। (वास्तव में आप भी कर सकते हैं, !=लेकिन एपीआई यह ए >और <प्रश्नों के संयोजन का उपयोग करते हुए करता है ।) यही कारण है कि विकास पर्यावरण आपके द्वारा किए जाने वाले सभी प्रश्नों की निगरानी करता है और स्वचालित रूप से आपकी index.yamlफ़ाइल में कोई भी गायब अनुक्रमणिका जोड़ता है ।

किसी LIKEक्वेरी के लिए अनुक्रमित करने का कोई तरीका नहीं है, इसलिए यह बस उपलब्ध नहीं है।

इस बारे में बहुत बेहतर और विस्तृत विवरण के लिए इस Google IO सत्र की घड़ी लें ।


77

मैं उसी समस्या का सामना कर रहा हूं, लेकिन मुझे Google ऐप इंजन पृष्ठों पर कुछ मिला:

युक्ति: क्वेरी फ़िल्टर में स्ट्रिंग मान के सिर्फ एक हिस्से से मेल खाने का कोई स्पष्ट तरीका नहीं है, लेकिन आप असमान फिल्टर का उपयोग करके एक उपसर्ग मैच नकली कर सकते हैं:

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

यह प्रत्येक MyModel इकाई को एक स्ट्रिंग प्रॉपर्टी प्रोप के साथ मेल खाता है जो कि अक्षर abc से शुरू होता है। यूनिकोड स्ट्रिंग यू "\ ufffd" सबसे बड़ा संभव यूनिकोड चरित्र का प्रतिनिधित्व करता है। जब गुण मान एक अनुक्रमणिका में क्रमबद्ध होते हैं, तो इस श्रेणी में आने वाले मान सभी दिए गए उपसर्गों से शुरू होते हैं।

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

शायद यह चाल कर सकता है;)


6
+1 थू यह इंगित करने योग्य है कि यह केस-संवेदी है। सौभाग्य से मैं जिस क्षेत्र में क्वेरी कर रहा हूं, उसका डेटा स्टोर करने से पहले लोअरकेस में बदल जाता है।
कोगा

12

Altough App Engine LIKE प्रश्नों का समर्थन नहीं करता है, ListProperty और StringListProperty के गुणों पर एक नज़र डालें । जब इन गुणों पर एक समानता परीक्षण किया जाता है, तो परीक्षण वास्तव में सभी सूची सदस्यों पर लागू किया जाएगा, उदाहरण के लिए, list_property = valueयदि सूची में कहीं भी मान दिखाई देता है तो परीक्षण।

कभी-कभी इस सुविधा का उपयोग LIKE क्वेरी की कमी के लिए समाधान के रूप में किया जा सकता है। उदाहरण के लिए, सरल पाठ खोज करना संभव बनाता है , जैसा कि इस पोस्ट पर वर्णित है


3
पोस्ट अब मौजूद नहीं है
mwm

9

SQL के समान पूर्ण पाठ खोज क्वेरी करने के लिए आपको खोज सेवा का उपयोग करना होगा LIKE

Gaelyk अधिक उपयोगकर्ता के अनुकूल खोज क्वेरी करने के लिए डोमेन विशिष्ट भाषा प्रदान करता है । उदाहरण के लिए स्निपेट के बाद पहली दस किताबें मिलेंगी जिनमें शीर्षक वाली नवीनतम 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
}

जैसे ग्रूवी के मैच ऑपरेटर के रूप में लिखा गया है =~। यह जैसे कार्यों का समर्थन करता है distance(geopoint(lat, lon), location)


4

ऐप इंजन ने संस्करण 1.7.0 में एक सामान्य-उद्देश्य पूर्ण पाठ खोज सेवा लॉन्च की, जो डेटास्टोर का समर्थन करती है।

घोषणा में विवरण ।

इसका उपयोग कैसे करें के बारे में अधिक जानकारी: https://cloud.google.com/appengine/training/fts_intro/lesson2


3

यहाँ Objectify पर एक नज़र डालें , यह एक डाटस्टोर एक्सेस एपीआई की तरह है। इस सवाल के साथ विशेष रूप से एक FAQ है, यहाँ जवाब है

मैं एक क्वेरी (LIKE "foo%" की तरह
कैसे कर सकता हूँ ) यदि आप स्टोर करने और खोजे जाने पर ऑर्डर को उल्टा करते हैं, तो आप स्टार्टविथ या एंडविथ जैसा कुछ कर सकते हैं। आप अपने इच्छित मूल्य के साथ एक श्रेणी क्वेरी करते हैं, और जो आप चाहते हैं उसके ठीक ऊपर एक मान।

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

1
यह खोज करेगा "" नहीं "समाहित" से शुरू होता है।
हार्दिक पटेल

1

बस यहाँ का पालन करें: init.py # 354 "> http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/ext/search/ inpy । 35 #

यह काम करता हैं!

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(...)

1

मैंने इसका परीक्षण GAE Datastore निम्न-स्तर जावा API के साथ किया। मैं और पूरी तरह से काम करता है

    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);

1
यह उपसर्ग के लिए काम करता है, लेकिन क्या होगा अगर मैं स्ट्रिंग के अंत से मेल खाना चाहता हूं? उदाहरण के लिए - मैं sdfdsabc में abc खोजना चाहता हूं, फिर इसे sdfdsabc
user1930106

1

सामान्य तौर पर, भले ही यह एक पुरानी पोस्ट हो, 'LIKE' या 'ILIKE' का उत्पादन करने का एक तरीका '' = '' क्वेरी से सभी परिणामों को इकट्ठा करना है, फिर तत्वों में लूप का परिणाम आपके लिए मौजूद तत्वों (या जावा) से है। 'तलाश कर रहे हैं

मान लें कि आप उपयोगकर्ताओं को aq = '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)

1

डेटास्टोर ऐप इंजन पर LIKE सर्च करना संभव नहीं है, अगर आप किसी स्ट्रिंग में किसी शब्द को सर्च करना चाहते हैं तो Arraylist बनाते समय यह ट्रिक कैसे करेंगे।

@Index
    public ArrayList<String> searchName;

और फिर ऑब्जेक्ट में ऑब्जेक्ट का उपयोग करके खोज करना।

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

और यह आपको उन सभी वस्तुओं के साथ एक सूची देगा, जिसमें वह दुनिया है जो आपने खोज पर की थी


0

यदि LIKE '%text%'हमेशा एक शब्द या कुछ (क्रमपरिवर्तन) की तुलना करें और आपका डेटा धीरे-धीरे बदलता है (धीरे-धीरे इसका मतलब है कि यह निषेधात्मक रूप से महंगा नहीं है - दोनों मूल्य-वार और प्रदर्शन-वार - सूचकांक बनाने और अद्यतन करने के लिए) तो संबंध सूचकांक इकाई (RIEIE) उत्तर हो सकता है।

हां, आपको अतिरिक्त डेटास्टोर इकाई का निर्माण करना होगा और इसे उचित रूप से आबाद करना होगा। हां, कुछ अड़चनें हैं जिनके लिए आपको खेलना होगा (जीएई डेटास्टोर में सूची संपत्ति की लंबाई पर 5000 की सीमा है)। लेकिन परिणामी खोजें तेजी से चमक रही हैं।

विवरण के लिए मेरे RIE को जावा और Ojbectify के साथ देखें और Python पोस्ट के साथ RIE


0

"जैसे" अक्सर पाठ खोज के लिए एक गरीब-आदमी के विकल्प के रूप में उपयोग किया जाता है। पाठ खोज के लिए, Whoosh-AppEngine का उपयोग करना संभव है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.