我正在尝试将vespa查询功能与ES和MongoDb进行比较,但我很难弄清楚YQL对JSON的高级查询有什么样的支持。 (顺便说一句,这将是vespa博客的一个很棒的帖子)
例如,给定一个具有嵌套文档和/或对象数组的对象Person(参见下面的示例),该怎么做:
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只是一种查询语法。 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”));
注意: