Naprawdę proste. W SQL, jeśli chcę przeszukać pole tekstowe dla kilku znaków, mogę zrobić:
SELECT blah FROM blah WHERE blah LIKE '%text%'
Dokumentacja App Engine nie wspomina, jak to osiągnąć, ale na pewno jest to dość powszechny problem?
google-app-engine
google-cloud-datastore
gql
littlecharva
źródło
źródło
Odpowiedzi:
BigTable, który jest zapleczem bazy danych dla App Engine, będzie skalowany do milionów rekordów. Z tego powodu App Engine nie pozwoli Ci wykonać żadnego zapytania, które spowoduje skanowanie tabeli, ponieważ wydajność byłaby straszna dla dobrze zapełnionej tabeli.
Innymi słowy, każde zapytanie musi używać indeksu. To dlatego można zrobić tylko
=
,>
i<
zapytań. (W rzeczywistości możesz również to zrobić,!=
ale API robi to za pomocą kombinacji zapytań>
i<
). Z tego powodu środowisko programistyczne monitoruje wszystkie zapytania, które wykonujesz i automatycznie dodaje wszelkie brakujące indeksy doindex.yaml
pliku.Nie ma możliwości indeksowania
LIKE
zapytania, więc jest po prostu niedostępne.Obejrzyj tę sesję Google IO, aby uzyskać znacznie lepsze i bardziej szczegółowe wyjaśnienie tego.
źródło
mam ten sam problem, ale znalazłem coś na stronach silnika aplikacji Google:
Wskazówka: filtry zapytań nie mają jawnego sposobu dopasowania tylko części wartości ciągu, ale możesz sfałszować dopasowanie prefiksu za pomocą filtrów nierówności:
To dopasowuje każdą jednostkę MyModel do właściwości string, która zaczyna się od znaków abc. Ciąg znaków Unicode u "\ ufffd" reprezentuje największy możliwy znak Unicode. Gdy wartości właściwości są sortowane w indeksie, wszystkie wartości należące do tego zakresu są wartościami rozpoczynającymi się od danego przedrostka.
http://code.google.com/appengine/docs/python/datastore/queriesandindexes.html
może to załatwi sprawę;)
źródło
Chociaż App Engine nie obsługuje zapytań LIKE, spójrz na właściwości ListProperty i StringListProperty . Gdy dla tych właściwości zostanie wykonany test równości, zostanie on faktycznie zastosowany do wszystkich elementów listy, np.
list_property = value
Testy, jeśli wartość pojawi się w dowolnym miejscu na liście.Czasami ta funkcja może być używana jako obejście braku zapytań LIKE. Na przykład umożliwia proste wyszukiwanie tekstu, jak opisano w tym poście .
źródło
Aby wykonywać zapytania wyszukiwania pełnotekstowego podobne do SQL, musisz użyć usługi wyszukiwania
LIKE
.Gaelyk zapewnia język specyficzny dla domeny, aby wykonywać bardziej przyjazne dla użytkownika zapytania . Na przykład poniższy fragment spowoduje znalezienie pierwszych dziesięciu książek posortowanych od najnowszych z tytułem zawierającym
fern
i dokładnie pasującym gatunkiemthriller
:Like jest zapisane jako operator dopasowania Groovy'ego
=~
. Obsługuje również takie funkcjedistance(geopoint(lat, lon), location)
.źródło
Silnik aplikacji 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 z tego korzystać: https://cloud.google.com/appengine/training/fts_intro/lesson2
źródło
Spójrz na Objectify tutaj , to jest jak Access API Datastore. Znajduje się tam często zadawane pytania dotyczące tego pytania, oto odpowiedź
źródło
Po prostu wykonaj następujące czynności: init.py # 354 "> http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/ext/search/ init .py # 354
To działa!
źródło
Przetestowałem to z niskopoziomowym API Java GAE Datastore. Ja i działa idealnie
źródło
Ogólnie, mimo że jest to stary post, sposobem na utworzenie „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, co szukasz.
Powiedzmy, że chcesz odfiltrować użytkowników, którym podano aq = 'luigi'
źródło
Nie jest możliwe wyszukanie LIKE w silniku aplikacji datastore, jakkolwiek utworzenie tablicy Arraylist załatwiłoby sprawę, gdyby trzeba było wyszukać słowo w ciągu.
a następnie przeszukać indeks przy użyciu Objectify.
a to da ci listę wszystkich elementów, które zawierają świat, który zrobiłeś podczas wyszukiwania
źródło
Jeśli
LIKE '%text%'
zawsze porównuje się do jednego lub kilku słów (pomyśl o permutacjach), a 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), wówczas Relation Index Entity (RIE) może być odpowiedzią.Tak, będziesz musiał zbudować dodatkową encję magazynu danych i odpowiednio ją wypełnić. Tak, istnieją pewne ograniczenia, z którymi będziesz musiał się bawić (jeden to 5000 limit długości właściwości listy w magazynie danych GAE). Ale wynikające z tego wyszukiwania są błyskawiczne.
Aby uzyskać szczegółowe informacje, zobacz moje RIE z Javą i Ojbectify oraz RIE z Pythonem .
źródło
„Lubię” jest często używane jako substytut wyszukiwania tekstu przez biedaka. Do wyszukiwania tekstowego można użyć Whoosh-AppEngine .
źródło