1

Я читал, что есть API поиска. Но похоже, что этот API не существует для Node.JS. Как я могу частично сопоставлять строки для запросов объектов без знания полного имени атрибута? Например, я хочу выбрать всех пользователей, начинающих с G. Как я могу это сделать? Благодарим за помощь!Точная частичная строка данных Datastore

ответ

4

В то время как вы не можете сделать «истинное» частичное соответствие строки (т.е. содержит) с Datastore, вы можете сделать «начинается с» запросом, как описан в this post:

В принципе, создать композитный фильтр неравенства, как это:

SELECT * FROM USER WHERE USERNAME >= 'G' AND USERNAME < 'G\ufffd'. 

Здесь \ufffd последний действительный юникода характер.

Это вернет все сущности с именами пользователей, начинающимися с «G». Вы можете использовать тот же метод для сопоставления нескольких символов (например, >= 'JA' and < 'JA\ufffd').

Обратите внимание, что строковые значения/индексы в хранилище данных чувствительны к регистру, поэтому вам необходимо проиндексировать свойство со всеми символами в нижнем регистре или в верхнем регистре, чтобы вы могли выполнить поиск соответственно.

Вы также можете имитировать поиск слов, как это -

Допустим, у вас есть свойство с именем name, который хранит следующие значения:

John Doe 
John Smith 
James Mike Murphy 

Чтобы сделать поиск слов (найти объекты с словом smith или james and murphy) - создайте другое свойство (например, nameIndex) и сохраните слова от имени в качестве свойства массива (обратите внимание, что все слова преобразуются в нижний регистр).

["john","doe"] 
["john", "smith"] 
["james", "mike" "murphy"] 

Теперь вы можете сделать поиск слов с помощью свойства nameIndex -

SELECT * FROM Entity WHERE nameIndex = 'smith' 
SELECT * FROM Entity WHERE nameIndex = 'james' AND nameIndex='murphy' 

Опять же, обратите внимание, что nameIndex нужно хранить данные в фиксированном случае (нижний или верхний) и ваши параметры запроса должен использовать этот случай. Кроме того, OR запросы не поддерживаются, если только клиентская библиотека, которую вы используете, не поддерживает (обычно это выполняется путем запуска нескольких запросов).

Этот подход не будет работать, если свойство имеет более чем 1500 байт данных (предельные для индексированных свойств)

Опять же, предлагаемые решения не являются заменой для полнотекстового поиска двигателей, а несколько хитростей может делать только с Datastore и может удовлетворить простые требования.

+0

ссылка для связи пуста? – JumpLink

+0

@JumpLink - Не уверен, что произошло с этой ссылкой, но этот ответ содержит всю необходимую информацию. –

1

Вы не можете выполнять частичный поиск совпадений в объектах хранилища данных (не говоря уже о том, чтобы не знать имя свойства/атрибута). См. Appengine Search API vs Datastore

И API поиска действительно недоступен в гибкой среде (включая Node.JS). Потенциальная альтернатива указывается Search section in Migrating Services from the Standard Environment to the Flexible Environment:

Служба поиска в настоящее время недоступен за пределами стандартной среды. Вы можете разместить любую полнотекстовую базу данных поиска, такую ​​как ElasticSearch on Google Compute Engine, и получить доступ к ней как от стандартной, так и от гибкой среды как от .

+0

Извините, если я не выразился четко. Я знаю имя свойства, но спасибо за ваш ответ. Я хочу разместить мой node.js-код в вычислительном/контейнерном двигателе, так что это проблема? – ReasoN

+0

Это так, как вычислительный/контейнерный двигатель находится за пределами стандартной среды GAE, поэтому вы не можете использовать API поиска. –

 Смежные вопросы

  • Нет связанных вопросов^_^