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 建模对象是否有任何最佳实践?

提前致谢。

4

1 回答 1

4

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

下面我将展示在每个变体中构建您的三个示例。Vespa 没有日期类型,所以在这里我假设您有一个“生日”整数字段。

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

// YQL(作为 GET URL 参数)
?query=select * from Persons where hobbies contains 'sports';&type=yql

// JSON (POST body)
{ "contains" : [ "hobbies", "sports" ]}

// Java 代码
query.getModel().getQueryTree().setRoot(new WordItem("sports", "hobbies"));

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

// YQL(作为 GET URL 参数)
?query=select * from Persons wherephones.areaCode contains 'NY';&type=yql

// JSON (POST body)
{"select" : { "where" : { "contains" : [ "phones.areaCode", "NY" ] } } }

// Java 代码
query.getModel().getQueryTree().setRoot(new WordItem("NY", "phones.areaCode"));

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

// YQL(作为 GET URL 参数)
?query=select * from Persons where mother.Birthyear > 1960;&type=yql

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

// Java 代码
query.getModel().getQueryTree().setRoot(new IntItem(">1960", "mother.Birthyear"));

笔记:

  • 通过在结构中打点来引用结构化字段。
  • 容器变为(具有这些标记)或(等于)取决于字段匹配设置。
于 2018-11-30T16:34:30.617 回答