Вопрос

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

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

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

Это было полезно?

Решение

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

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

Нет возможности индексировать LIKE запрос, поэтому он просто недоступен.

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

Другие советы

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

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

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

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

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

возможно, это поможет ;)

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

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

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

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

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

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

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

Взгляните на Objectify здесь , это похоже на API доступа к хранилищу данных.Конкретно по этому вопросу есть FAQ, вот ответ

Как мне сделать запрос лайка (LIKE "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/в этом.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 Datastore.У меня и работает отлично

    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)

Невозможно выполнить поиск LIKE в движке приложения хранилища данных, однако создание списка массивов поможет, если вам нужно найти слово в строке.

@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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top