Google App Engine:можно ли сделать gql-запрос?


проста на самом деле. В SQL, если я хочу найти текстовое поле для нескольких символов, я могу сделать:

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

в документации для App Engine не упоминается, как этого достичь, но, конечно, это достаточно распространенная проблема?

12 118

12 ответов:

BigTable, который является серверной частью базы данных для App Engine, будет масштабироваться до миллионов записей. Из-за этого App Engine не позволит вам делать какие-либо запросы, которые приведут к сканированию таблицы, так как производительность будет ужасной для хорошо заполненной таблицы.

другими словами, каждый запрос должен использовать индекс. Вот почему вы можете только сделать =,> и < запросы. (На самом деле вы также можете сделать != но API делает это с помощью комбинации > и < запросы.) Именно поэтому среда разработки отслеживает все запросы, которые вы делаете, и автоматически добавляет любые отсутствующие индексы в ваш .

нет никакого способа, чтобы индекс LIKE запрос, поэтому он просто недоступен.

есть часы это Google IO сессии для гораздо лучшего и более подробного объяснения этого.

я столкнулся с той же проблемой, но я нашел что-то на страницах Google App engine:

Совет: фильтры запросов не имеют явного способа сопоставления только части строкового значения, но вы можете подделать совпадение префикса с помощью фильтров неравенства:

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

Это соответствует каждой сущности MyModel со строковым свойством prop, которое начинается с символов abc. Строка Юникода u "\ufffd " представляет максимально возможный символ Юникода. Когда значения свойств сортируются в index, значения, которые попадают в этот диапазон, - это все значения, которые начинаются с данного префикса.

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

может быть, это может сделать трюк ;)

Altough App Engine не поддерживает подобные запросы, посмотрите на свойства ListProperty и StringListProperty. Когда тест равенства выполняется для этих свойств, тест будет фактически применен ко всем членам списка, например,list_property = value проверяет, отображается ли значение в любом месте списка.

иногда эта функция может использоваться как обходной путь к отсутствию подобных запросов. Например, это позволяет сделать простой текстовый поиск, как описано на этом посту.

вы должны использовать сервис поиска для выполнения полнотекстовых поисковых запросов, подобных 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
}

Like записывается как оператор матча Groovy =~. Оно поддерживает такие функции, как distance(geopoint(lat, lon), location) как хорошо.

App engine запущен общего назначения сервис полнотекстового поиска в версии 1.7.0, которая поддерживает хранилища данных.

подробности на объявление.

дополнительная информация о том, как это использовать:https://cloud.google.com/appengine/training/fts_intro/lesson2

посмотреть объективировать здесь, Это похоже на API доступа к хранилищу данных. Есть FAQ с этим вопросом конкретно, вот это ответ!--4-->

Как мне сделать подобный запрос (например, "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/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(...)

Я проверил это с помощью низкоуровневого Java API хранилища данных 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);

В общем, даже если это старый пост, способ создать "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)

это не возможно сделать подобный поиск на datastore App engine, как когда-либо создание Arraylist будет делать трюк, если вам нужно искать слово в строке.

@Index
    public ArrayList<String> searchName;

а затем искать в индексе с помощью objectify.

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

и это даст вам список со всеми элементами, которые содержат мир, который вы сделали на поиск

Если LIKE '%text%' всегда сравнивается со словом или несколькими (подумайте о перестановках), и ваши данные медленно меняются (медленно означает, что это не слишком дорого - как по цене, так и по производительности-для создания и обновления индексов), тогда Relation Index Entity (RIE) может быть ответом.

да, вам нужно будет создать дополнительную сущность хранилища данных и заполнить ее соответствующим образом. Да, есть некоторые ограничения, которые вам придется обойти (один из них-ограничение 5000 на длину списка свойство в хранилище данных GAE). Но результаты поисков молниеносны.

Подробнее см. Мой RIE с Java и Ojbectify и RIE с Python сообщения.

" Как " часто используется в качестве замены бедного человека для текстового поиска. Для текстового поиска можно использовать Whoosh-AppEngine.