Можно ли запросить фильтрацию объектов по вложенным значениям атрибутов или по массиву объектов? - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь сравнить возможности запросов vespa как с ES, так и с MongoDb, но мне трудно понять, какую поддержку YQL имеет для расширенных запросов через JSON.(кстати, это был бы отличный пост для блога vespa)

Например, для объекта Person (см. пример ниже) с вложенными документами и / или массивом объектов, как это можно сделать:

  • Выбрать всех людей, чьи увлечения содержат «спорт».
  • Выбрать всех людей, чей код города телефонный номер равен «NY».
  • Выбрать всех людей, чья дата рождения матери превышает 1960.

Person = { Name: 'Joe', Hobbies: ['sports','books','bonzais'], Phones: [{Number: '12-3456-7890', areaCode: 'NY'},{Number: '22-3456-7890', areaCode: 'CA'}], Mother: { Name: 'Mom', Birthdate: '1961-24-02' } }

Кроме того, есть ли рекомендации по моделированию объекта для Vespa / YQL?

Заранее спасибо.

1 Ответ

0 голосов
/ 30 ноября 2018

Сначала уточнение: YQL - это просто синтаксис запроса.Язык запросов JSON (https://docs.vespa.ai/documentation/reference/select-reference.html) - это другой. Еще один способ (наиболее распространенный) - это создание запросов непосредственно из данных, полученных от клиентов в компоненте Searcher (Java).

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

Выбрать всех людей, чьи хобби содержит 'sport '.

// YQL (в качестве параметров GET URL)
? query = select * from Персоны, в которых хобби содержит "sports"; & type = yql

// JSON(POST body)
{"Содержит": ["Хобби", "Спорт"]}

// Java-код
query.getModel (). GetQueryTree (). SetRoot (new WordItem ("sports", "hobbies"));

Выбрать всех лиц, чей код города для телефонов равен 'NY'.

// YQL (в качестве параметров GET URL)
? Query = select * from Персоны, в которыхphones.areaCode содержит 'NY'; & type = yql

// JSON (тело сообщения POST)
{"select": {"where": {"содержит": ["phones.areaCode", "NY"]}}}}

// Java-код
query.getModel (). getQueryTree (). setRoot (new WordItem ("NY", "phones.areaCode"));

Выбрать всех лиц, чья дата рождения матери превышает 1960.

// YQL (как GETПараметры URL)
? Query = select * из Persons, где mother.Birthyear> 1960; & type = yql

// JSON (POST body)
{"select": {"where": {"range": ["mother.Birthyear", {">": 1960}]}}}

// Java-код
query.getModel (). getQueryTree (). setRoot (new IntItem ("> 1960", "mother.Birthyear"));

Примечание:

  • Ссылка на структурированные поля связана с точками в структурах.
  • Контейнеры становятся (имеетэти маркеры) или (равно) в зависимости от настройки соответствия поля.
...