我正在尝试将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建模对象的最佳实践?
谢谢。
答案 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”,“母亲。出生年”));
注意: