На самом деле простой. В SQL, если я хочу найти в текстовом поле пару символов, я могу:
SELECT blah FROM blah WHERE blah LIKE '%text%'
В документации по App Engine не упоминается, как этого добиться, но разве это достаточно распространенная проблема?
google-app-engine
google-cloud-datastore
gql
littlecharva
источник
источник
Ответы:
BigTable, которая является серверной частью базы данных для App Engine, будет масштабироваться до миллионов записей. Из-за этого App Engine не позволит вам выполнять какие-либо запросы, которые приведут к сканированию таблицы, так как производительность для хорошо заполненной таблицы будет ужасной.
Другими словами, каждый запрос должен использовать индекс. Именно поэтому вы можете только сделать
=
,>
и<
запросы. (На самом деле вы можете сделать ,!=
но API делает это , используя аа комбинации>
и<
запросов.) Это также почему среда разработки отслеживает все запросы вы делаете , и автоматически добавляет недостающие индексы в свойindex.yaml
файл.LIKE
Невозможно индексировать запрос, поэтому он просто недоступен.Посмотрите этот сеанс Google IO, чтобы получить более подробное и лучшее объяснение этого.
источник
У меня та же проблема, но я нашел что-то на страницах движка приложений Google:
Совет: фильтры запросов не имеют явного способа сопоставления только части строкового значения, но вы можете подделать совпадение префикса, используя фильтры неравенства:
Это соответствует каждой сущности 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
.Gaelyk предоставляет язык для конкретной предметной области для выполнения более удобных поисковых запросов . Например, следующий фрагмент найдет первые десять книг, отсортированных от последних, с указанием названия
fern
и точно совпадающим жанромthriller
:Like записывается как оператор сопоставления Groovy
=~
. Он также поддерживает такие функцииdistance(geopoint(lat, lon), location)
.источник
Движок приложений запустил универсальную службу полнотекстового поиска в версии 1.7.0, которая поддерживает хранилище данных.
Подробности в объявлении .
Дополнительная информация о том, как это использовать: https://cloud.google.com/appengine/training/fts_intro/lesson2
источник
Взгляните на Objectify здесь , это похоже на API доступа к хранилищу данных. Именно с этим вопросом есть FAQ, вот ответ
источник
Просто следуйте здесь: init.py # 354 "> http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/ext/search/ init .py # 354
Оно работает!
источник
Я тестировал это с помощью низкоуровневого Java API GAE Datastore. У меня и работает отлично
источник
В общем, даже несмотря на то, что это старый пост, способ создать 'LIKE' или 'ILIKE' состоит в том, чтобы собрать все результаты из запроса '> =', а затем цикл результатов в python (или Java) для элементов, содержащих то, что вы ищем.
Допустим, вы хотите отфильтровать пользователей с учетом aq = 'luigi'
источник
Невозможно выполнить поиск LIKE на движке приложения хранилища данных, однако создание Arraylist поможет, если вам нужно найти слово в строке.
а затем выполнить поиск в индексе с помощью objectify.
и это даст вам список со всеми элементами, которые содержат мир, который вы искали.
источник
Если
LIKE '%text%'
всегда сравнивается с одним словом или несколькими (подумайте о перестановках) и ваши данные изменяются медленно (медленно означает, что создание и обновление индексов не слишком дорого - как с точки зрения цены, так и с точки зрения производительности)), тогда объект индекса отношения (RIE) может быть ответом.Да, вам придется создать дополнительный объект хранилища данных и соответствующим образом заполнить его. Да, есть некоторые ограничения, с которыми вам придется поиграть (одно из них - ограничение в 5000 на длину свойства списка в хранилище данных GAE). Но поисковые запросы происходят молниеносно.
Подробнее см. Мои сообщения RIE с Java и Ojbectify и RIE с Python .
источник
"Нравится" часто используется бедняками вместо поиска текста. Для текстового поиска можно использовать Whoosh-AppEngine .
источник