样本数据:
"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": "塔库尔"
}
}]
请提出一种更好的方法,或者对我目前的方法有任何帮助。两者都受到赞赏。