【问题标题】:Is it possible to query objects filtering by nested attribute values or by array of objects?是否可以通过嵌套属性值或对象数组查询对象过滤?
【发布时间】:2018-11-29 18:15:48
【问题描述】:

我正在尝试将 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】:

    首先澄清一下: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 正文)
    {“包含”:[“爱好”、“运动”]}

    // 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 正文)
    {"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 正文)
    {"select" : { "where" : { "range" : [ "mother.Birthyear", { ">": 1960}] } } }

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

    注意:

    • 结构化字段通过在结构中的点来引用。
    • 容器变为(具有这些标记)或(等于)取决于字段匹配设置。

    【讨论】:

    猜你喜欢
    • 2021-12-29
    • 2018-01-16
    • 2020-09-17
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多