গুগল অ্যাপ ইঞ্জিন: জিকিএল লাইক কোয়েরি করা কি সম্ভব?


123

সত্যিই সহজ। এসকিউএল-তে, আমি কয়েকটি অক্ষরের জন্য যদি কোনও পাঠ্য ক্ষেত্র অনুসন্ধান করতে চাই, তবে আমি এটি করতে পারি:

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

অ্যাপ ইঞ্জিনের জন্য ডকুমেন্টেশন কীভাবে এটি অর্জন করবে সে সম্পর্কে কোনও উল্লেখ করে না, তবে অবশ্যই এটি একটি সাধারণ যথেষ্ট সমস্যা?


3
অব্যাহত সমস্যা জিএই ডেটাস্টোরকে ব্যবহার করার চেষ্টা করে এমন মানুষগুলির চারপাশে ঘোরে যেমন এটি কোনও সম্পর্কিত / ~ এসকিউএল ডাটাবেস। গুগল জিকিউএল প্রবর্তন করে, এটি এসকিউএল সিস্টেমের ক্ষেত্রে লোকদের আরও চিন্তাভাবনার দিকে পরিচালিত করে। তবে আমি বুঝতে পারি যে গুগল সবার পক্ষে স্থানান্তরকে আরও সহজ করার চেষ্টা করছে যদিও আমি নিশ্চিত নই যে এটি সঠিক পদ্ধতির।
fuentesjr

উত্তর:


81

বিগ টেবিল, যা অ্যাপ ইঞ্জিনের ডাটাবেস ব্যাক এন্ড, কয়েক মিলিয়ন রেকর্ডে স্কেল হবে। এ কারণে, অ্যাপ ইঞ্জিন আপনাকে এমন কোনও কোয়েরি করতে অনুমতি দেবে না যার ফলস্বরূপ কোনও টেবিল স্ক্যান হবে, কারণ একটি ভাল জনবহুল টেবিলের জন্য পারফরম্যান্স ভয়ঙ্কর হবে।

অন্য কথায়, প্রতিটি ক্যোয়ারিতে অবশ্যই একটি সূচক ব্যবহার করা উচিত। এজন্য আপনি কেবল করতে পারেন =, >এবং <প্রশ্নগুলি eries (আসলে আপনি এটি করতে পারেন !=তবে এপিআই এটি >এবং কোয়ের সংমিশ্রণগুলি ব্যবহার করে এটি করে <)) এজন্যই বিকাশ পরিবেশ আপনি যে সমস্ত ক্যোয়ারী পর্যবেক্ষণ করে এবং স্বয়ংক্রিয়ভাবে আপনার index.yamlফাইলটিতে কোনও অনুপস্থিত সূচী যুক্ত করে ।

কোনও LIKEপ্রশ্নের জন্য সূচীকরণের কোনও উপায় নেই সুতরাং এটি সহজলভ্য নয়।

এর আরও ভাল এবং আরও বিশদ ব্যাখ্যার জন্য এই গুগল আইও সেশনের একটি নজর রাখুন ।


77

আমি একই সমস্যার মুখোমুখি, তবে আমি গুগল অ্যাপ ইঞ্জিন পৃষ্ঠায় কিছু পেয়েছি:

টিপ: ক্যোয়ারি ফিল্টারগুলিতে স্ট্রিং মানের কিছু অংশের সাথে মিলানোর সুস্পষ্ট উপায় নেই তবে আপনি অসমতার ফিল্টার ব্যবহার করে একটি উপসর্গের ম্যাচ জাল করতে পারেন:

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

এটি প্রতিটি মাইমোডেল সত্তাকে মেলে এমন একটি স্ট্রিং প্রপার সাথে যা অক্ষরের সাথে শুরু হয় এবিসি। ইউনিকোড স্ট্রিং u "ff ufffd" বৃহত্তম সম্ভাব্য ইউনিকোড অক্ষরকে উপস্থাপন করে। যখন সূচকগুলিতে সম্পত্তি মানগুলি বাছাই করা হয়, তখন এই সীমাতে যে মানগুলি হয় সেগুলি প্রদত্ত উপসর্গ দিয়ে শুরু হওয়া মানগুলির মধ্যে সমস্ত।

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

সম্ভবত এটি কৌশলটি করতে পারে;)


6
+1 তবে এটি উল্লেখ করার মতো এটি কেস-সংবেদনশীল। ভাগ্যক্রমে ক্ষেত্রের যে ডেটা আমি জিজ্ঞাসা করছি সেগুলি সংরক্ষণের আগে লোয়ারকেসে রূপান্তরিত হয়।
কুগা

12

আল্টুফ অ্যাপ ইঞ্জিন LIKE ক্যোরিয়াকে সমর্থন করে না, বৈশিষ্ট্য তালিকাফলক এবং দেখুন স্ট্রিংলিস্টপ্রোপার্টি । এই বৈশিষ্ট্যগুলিতে যখন একটি সমতা পরীক্ষা করা হয়, তখন পরীক্ষার তালিকাটি সমস্ত তালিকার সদস্যদের উপর প্রয়োগ করা হয়, উদাহরণস্বরূপ, list_property = valueতালিকার মান কোথাও উপস্থিত হয় কিনা তা পরীক্ষা করে।

কখনও কখনও এই বৈশিষ্ট্যটি LIKE প্রশ্নের অভাবের জন্য কার্যক্ষম হিসাবে ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ, এই পোস্টে বর্ণিত হিসাবে এটি সহজ পাঠ্য অনুসন্ধান করা সম্ভব করে তোলে ।


3
পোস্টটি আর বিদ্যমান নেই
mwm

9

এসকিউএলের অনুরূপ পূর্ণ পাঠ্য অনুসন্ধান ক্যোয়ারীগুলি সম্পাদন করতে আপনাকে অনুসন্ধান পরিষেবা ব্যবহার করতে হবে 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
}

লাইভ গ্রোভির ম্যাচ অপারেটর হিসাবে লেখা হয়েছে =~। এটি distance(geopoint(lat, lon), location)পাশাপাশি ফাংশন সমর্থন করে ।


4

অ্যাপ ইঞ্জিন একটি সাধারণ-উদ্দেশ্য পূর্ণ পাঠ্য অনুসন্ধান পরিষেবা চালু করেছে 1.7.0 সংস্করণে যা ডেটাস্টোর সমর্থন করে।

ইন বিশদ ঘোষণা

এটি কীভাবে ব্যবহার করবেন সে সম্পর্কে আরও তথ্য: https://cloud.google.com/appengine/training/fts_intro/lesson2


3

এখানে অবজেক্টিফাই দেখুন , এটি একটি ডেটাস্টোর অ্যাক্সেস API এর মতো like এই প্রশ্নটির সাথে একটি FAQ রয়েছে বিশেষভাবে, উত্তরটি এখানে

আমি কীভাবে একটি অনুরূপ জিজ্ঞাসা করব ("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/ init .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(...)

1

আমি এটি GAE ডেটাস্টোর নিম্ন-স্তরের জাভা এপিআই দিয়ে পরীক্ষা করেছি। আমি এবং পুরোপুরি কাজ করে

    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
এটি উপসর্গের জন্য কাজ করে, তবে আমি যদি স্ট্রিংয়ের শেষে থেকে মেলাতে চাই? উদাহরণস্বরূপ - আমি এসডিএফডিএসবিসি-তে এবিসি অনুসন্ধান করতে চাই, তবে এটি এসডিএফডিএসবিসি ফিরে আসবে
ইউজার 1930106

1

সাধারণভাবে, যদিও এটি একটি পুরাতন পোস্ট, '' লাইক 'বা' আইলিকেই 'উত্পাদন করার একটি উপায় হ'ল'> = 'কোয়েরি থেকে সমস্ত ফলাফল সংগ্রহ করা, তারপরে আপনি কী উপাদান রয়েছে সেগুলির জন্য পাইথন (বা জাভা) এর লুপ ফলাফল পাওয়া যায় for খুঁজছি।

ধরা যাক আপনি ব্যবহারকারীদের aq = 'লুইজি' ফিল্টার করতে চান

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

ডেটাস্টোর অ্যাপ ইঞ্জিনে লাইক অনুসন্ধান করা সম্ভব নয়, আপনি যদি কোনও স্ট্রিংয়ে কোনও শব্দ অনুসন্ধান করতে চান তবে কোনও অ্যারেলিস্ট তৈরি করা কখনই কৌশলটি করতে পারে।

@Index
    public ArrayList<String> searchName;

এবং তারপরে আপত্তিজনক ব্যবহার করে সূচীতে অনুসন্ধান করতে।

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

এবং এটি আপনাকে সেই সমস্ত আইটেমের সাথে একটি তালিকা দেবে যা আপনি সন্ধানে করেছেন বিশ্বকে ধারণ করে


0

যদি LIKE '%text%'সর্বদা কোনও শব্দের সাথে বা কয়েকটির সাথে তুলনা করা হয় (অনুমানের কথা ভাবেন) এবং আপনার ডেটা ধীরে ধীরে পরিবর্তিত হয় (আস্তে আস্তে অর্থ হ'ল এটি প্রতিরোধমূলক ব্যয়বহুল নয় - মূল্য-ভিত্তিক এবং কার্য সম্পাদন ভিত্তিক উভয় - সূচকগুলি তৈরি এবং আপডেট করতে) তবে সম্পর্কিত সূচক সত্তা (আরআইআই) উত্তর হতে পারে।

হ্যাঁ, আপনাকে অতিরিক্ত ডেটাস্টোর সত্তা তৈরি করতে হবে এবং এটিকে যথাযথভাবে পপুলেট করতে হবে। হ্যাঁ, কিছু বাধা রয়েছে যা আপনার চারপাশে খেলতে হবে (জিএইটি ডেটাস্টোরের তালিকার সম্পত্তিটির দৈর্ঘ্যের 5000 সীমা। তবে ফলস্বরূপ অনুসন্ধানগুলি দ্রুত বজ্রপাত করছে।

বিশদগুলির জন্য জাভা এবং ওজবেক্টিফাইয়ের সাথে আমার আরআইআই এবং পাইথন পোস্ট সহ আরআইআই দেখুন


0

"লাইক" প্রায়শই পাঠ্য অনুসন্ধানের জন্য দরিদ্র লোকের বিকল্প হিসাবে ব্যবহৃত হয়। পাঠ্য অনুসন্ধানের জন্য, হুশ-অ্যাপেনজাইন ব্যবহার করা সম্ভব ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.