1

样本数据:

"fields": {
    "key1":0,
    "key2":"no",
    "Lang": {
        "en": {
            "firstName": "Vikrant",
            "lastName":"Thakur"
        },
        "ch": {
            "firstName": "维克兰特",
            "lastName":"塔库尔"
        }
    }
}

预期反应:

"fields": {
  "Lang": {
      "en": {
          "firstName": "Vikrant",
          "lastName":"Thakur"
       }
  }
}

我在搜索定义demo.sd中添加了以下内容:

struct lang {
  field firstName type string {}
  field lastName type string {}
}

field Lang type map <string, lang> {
  indexing: summary
  struct-field key {
    indexing: summary | index | attribute
  }
}

我想写一个这样的yql查询(这不起作用):

http://localhost:8080/search/?yql=select Lang.en from sources demo where key2 contains 'no';

我的临时解决方法

我在MySearcher.java中实现了一个自定义搜索器,通过它我可以提取所需的子字段并设置一个新字段“defaultLang”,并删除“Lang”字段。搜索者生成的响应:

"fields": {
  "defaultLang": {
      "firstName": "Vikrant",
      "lastName":"Thakur"
  }
}

我在 MySearcher.java 中编写了以下内容:

for (Hit hit: result.hits()) {
    String language = "en";  //temporarily hard-coded
    StructuredData Lang = (StructuredData) hit.getField("Lang");
    Inspector o = Lang.inspect();
    for (int j=0;j<o.entryCount();j++){
        if (o.entry(j).field("key").asString("").equals(language)){
            SlimeAdapter value = (SlimeAdapter) o.entry(j).field("value");
            hit.setField("defaultLang",value);
            break;
        }
    }
    hit.removeField("Lang");
}

Edit-1:一种更有效的方法是使用 Inspectable 界面和 Inspector,就像上面一样(感谢@Jo Kristian Bergum)

但是,在上面的代码中,我必须遍历所有语言以过滤掉所需的语言。我想避免这种 O(n) 时间复杂性并利用映射结构在 O(1) 中访问它。(因为语言可能会增加到 1000 种,每次点击都会这样做。)

这一切都是由于我在结果中得到的StructuredData数据类型。StructureData 不保留地图结构,而是提供一个 JSON 数组,例如:

[{
  "key": "en",
  "value": {
    "firstName": "Vikrant",
    "lastName": "Thakur"
  }
}, {
  "key": "ch",
  "value": {
    "firstName": "维克兰特",
    "lastName": "塔库尔"
  }
}]

请提出一种更好的方法,或者对我目前的方法有任何帮助。两者都受到赞赏。

4

1 回答 1

3

我猜 YQL 示例查询是为了说明您想要什么,因为该语法无效。从类型为 map 的字段 Lang 中选择给定键可以像在搜索器中一样完成,但是反序列化为 JSON 并解析 JSON 可能效率低下,因为 StructuredData 实现了 Inspectable 接口,您可以直接检查它而无需通过 JSON格式。见https://docs.vespa.ai/documentation/reference/inspecting-structured-data.html

于 2019-01-02T10:39:03.000 回答