Google App Engine: czy można zrobić zapytanie typu Gql?

Proste, naprawdę. W SQL, jeśli chcę przeszukać pole tekstowe dla kilku znaków, mogę zrobić:

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

Dokumentacja dla App Engine nie wspomina o tym, jak to osiągnąć, ale na pewno jest to dość powszechny problem?

Author: Dan McGrath, 2008-09-07

12 answers

BigTable, który jest zapleczem bazy danych dla silnika aplikacji, będzie skalowany do milionów rekordów. Z tego powodu silnik App Engine nie pozwoli Ci wykonać żadnych zapytań, które spowodują skanowanie tabeli, ponieważ wydajność byłaby straszna dla dobrze wypełnionej tabeli.

Innymi słowy, każde zapytanie musi używać indeksu. Dlatego możesz tylko =, > i < zapytań. (W rzeczywistości możesz również wykonać !=, ale API robi to za pomocą kombinacji zapytań > i <.) Dlatego też środowisko programistyczne monitoruje wszystkie wykonywane zapytania i automatycznie dodaje brakujące indeksy do pliku index.yaml.

Nie ma możliwości indeksowania zapytania LIKE, więc po prostu nie jest ono dostępne.

Obejrzyj tę sesję Google IO, aby uzyskać znacznie lepsze i bardziej szczegółowe wyjaśnienie tego.

 78
Author: Dave Webb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-22 18:16:36

Mam ten sam problem, ale znalazłem coś na stronach google app engine:

Wskazówka: filtry zapytań nie mają jednoznacznego sposobu dopasowania tylko części wartości ciągu znaków, ale można sfałszować dopasowanie przedrostka za pomocą filtrów nierówności:

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

To pasuje do każdego elementu MyModel z właściwością string, która zaczyna się od znaków abc. Łańcuch unicode u"\ufffd " reprezentuje największy możliwy znak Unicode. Gdy wartości właściwości są sortowane w indeksie, wartości które mieszczą się w tym zakresie to wszystkie wartości zaczynające się od podanego prefiksu.

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

Może to da radę;)

 74
Author: solidsnack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-21 00:43:52

Mimo że silnik aplikacji nie obsługuje podobnych zapytań, spójrz na właściwości ListProperty i StringListProperty . Gdy test równości zostanie wykonany na tych właściwościach, test zostanie zastosowany na wszystkich członach listy, np. list_property = value testuje, jeśli wartość pojawi się w dowolnym miejscu listy.

Czasami ta funkcja może być używana jako obejście braku podobnych zapytań. Na przykład, pozwala na Proste wyszukiwanie tekstu, jak opisano na tej post .

 12
Author: jbochi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-25 22:43:56

Musisz użyć search service do wykonywania pełnotekstowych zapytań podobnych do SQL LIKE.

Gaelyk zapewnia język specyficzny dla domeny, aby wykonywać więcej przyjaznych dla użytkownika zapytań wyszukiwania . Na przykład po fragmencie znajdziesz pierwsze dziesięć książek posortowanych od najnowszych z tytułem zawierającym fern i gatunek dokładnie pasujący 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
}

Like jest zapisywany jako operator dopasowania Groovy ' ego =~. Obsługuje również funkcje takie jak distance(geopoint(lat, lon), location).

 9
Author: musketyr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-25 22:21:39

App engine uruchomił usługę wyszukiwania pełnotekstowego ogólnego przeznaczenia w wersji 1.7.0, która obsługuje magazyn danych.

Szczegóły w ogłoszeniu .

Więcej informacji o tym, jak tego używać: https://cloud.google.com/appengine/training/fts_intro/lesson2

 4
Author: ryan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-15 08:48:46

Spójrz na Objectify tutaj, to jest jak API dostępu do magazynu danych. Istnieje FAQ z tym pytaniem konkretnie, oto odpowiedź

Jak zrobić podobne zapytanie (jak "foo%")
Możesz zrobić coś takiego jak startWith, lub endWith, jeśli odwrócisz kolejność podczas przechowywania i wyszukiwania. Wykonujesz zapytanie zakresu z żądaną wartością początkową i wartością tuż nad żądaną.

String start = "foo";
    ... = ofy.query(MyEntity.class).filter("field >=", start).filter("field <", start + "\uFFFD");
 3
Author: fernandohur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-24 17:05:24

Po prostu śledź tutaj: init.py#354">http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/ext/search/init.py#354

To działa!
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
Author: gzerone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-20 02:35:55

Przetestowałem to za pomocą niskopoziomowego API Java Gae Datastore. Mnie i działa doskonale

    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
Author: Edy Aguirre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-25 16:59:46

Ogólnie rzecz biorąc, mimo że jest to stary post, sposobem na wygenerowanie 'LIKE' lub 'ILIKE' jest zebranie wszystkich wyników z zapytania'>=', a następnie zapętlenie wyników w Pythonie (lub Javie) dla elementów zawierających to, czego szukasz.

Powiedzmy, że chcesz filtrować użytkowników o 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)
 1
Author: chuycepeda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-19 18:09:24

Nie jest możliwe, aby zrobić podobne wyszukiwanie na datastore App engine, jak kiedykolwiek tworzenie Arraylist zrobi sztuczkę, jeśli trzeba przeszukać słowo w ciągu znaków.

@Index
    public ArrayList<String> searchName;

A następnie przeszukać indeks za pomocą objectify.

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

A to da ci listę wszystkich przedmiotów, które zawierają świat, który zrobiłeś podczas wyszukiwania

 1
Author: Jose Salas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-12 20:30:50

Jeśli LIKE '%text%' zawsze porównuje się do słowa lub kilku (myśl permutacje) i Twoje dane zmieniają się powoli (powoli oznacza, że tworzenie i aktualizowanie indeksów nie jest zbyt drogie - zarówno pod względem ceny, jak i wydajności), odpowiedzią może być Encja indeksu relacji (Rie).

Tak, będziesz musiał zbudować dodatkową jednostkę magazynu danych i odpowiednio ją wypełnić. Tak, istnieją pewne ograniczenia, które trzeba będzie odtworzyć (jeden jest 5000 limit na długości właściwości listy w GAE datastore). Ale wyniki wyszukiwania są błyskawiczne.

Po szczegóły zobacz moje posty RIE z Javą i Ojbectify Oraz rie z Pythonem.

 0
Author: topchef,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-03 19:23:02

"Jak" jest często używany jako substytut wyszukiwania tekstu. Do wyszukiwania tekstu można użyć Whoosh-AppEngine .

 0
Author: amit_grepclub,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-26 20:47:13