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

问题描述 投票:1回答:1

我正在尝试将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建模对象的最佳实践吗?

提前致谢。

yql vespa
1个回答
4
投票

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

下面我将展示在每个变体中构建您的三个示例。 Vespa没有日期类型所以我假设你有一个'Birthyear'整数字段。

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

// YQL(作为GET URL参数) ?query = select * from Honsbies包含'sports';&type = yql

// JSON(POST正文) {“包含”:[“爱好”,“体育”]}

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

选择手机区号等于'NY'的所有人。

// YQL(作为GET URL参数) ?query = select * from Persons,其中phones.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 whoons where mother.Birthyear> 1960;&type = yql

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

// Java代码 query.getModel()。getQueryTree()。​​setRoot(new IntItem(“> 1960”,“mother.Birthyear”));

注意:

  • 通过点入结构来引用结构化字段。
  • 容器变为(具有这些标记)或(等于),具体取决于字段匹配设置。
© www.soinside.com 2019 - 2024. All rights reserved.