是否可以查询按嵌套属性值或对象数组过滤的对象?

时间:2018-11-29 18:15:48

标签: yql vespa

我正在尝试将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 :(得分:4)

首先要澄清:YQL只是一种查询语法。 JSON查询语言(https://docs.vespa.ai/documentation/reference/select-reference.html)是另一种。另一种方法(最常见的方法)是直接从Searcher(Java)组件中从客户端接收的数据构造查询。

下面,我展示在每种变体中构造您的三个示例。 Vespa没有日期类型,因此在此我假设您使用的是“生日”整数字段。

选择所有爱好包含“运动”的人。

// YQL(作为GET URL参数)
?query = select * from爱好包含“体育”的人;&type = yql

// JSON(POST正文)
{“ contains”:[“爱好”,“运动”]}

// Java代码
query.getModel()。getQueryTree()。​​setRoot(new WordItem(“ sports”,“ hobby”)))

选择电话区号等于“ NY”的所有人员。

// YQL(作为GET URL参数)
?query = select * from那些phone.areaCode包含“ NY”的人;&type = yql

// JSON(POST正文)
{“ select”:{“ where”:{“ contains”:[“ phones.areaCode”,“ NY”]}}}

// Java代码
query.getModel()。getQueryTree()。​​setRoot(new WordItem(“ NY”,“ phones.areaCode”));

选择所有母亲的生日大于1960年的人。

// YQL(作为GET URL参数)
?query = select * from母亲所在的人。出生年份> 1960;&type = yql

// JSON(POST正文)
{“ select”:{“ where”:{“ range”:[“ mother.Birthyear”,{“>”:1960}]}}}

// Java代码
query.getModel()。getQueryTree()。​​setRoot(new IntItem(“> 1960”,“母亲。出生年”));

注意:

  • 通过点入结构来引用结构化字段。
  • 根据字段匹配设置,容器变为(具有这些标记)或(等于)。