java - ElasticSearch Java 客户端查询“双重”嵌套对象
问题描述
我有这样的弹性嵌套数据。对于属性,best_practice
得到单嵌套查询,属性work_field
得到双嵌套查询。
我想将双嵌套结构(关于work_field
)的查询转换为 Java 代码
"_source": {
"best_practice": [
{
"code": "A002",
"best_practice_summary": "a",
"best_practice_type": "AAA"
},
{
"code": "A001",
"best_practice_summary": "s",
"best_practice_type": "BBB"
}
],
"work_field": {
"choice_field": [
{
"isSelected": true,
"idx": 1,
"value": "CCC",
"key": "B002"
},
{
"isSelected": true,
"idx": 77,
"value": "DDD",
"key": "B078"
}
]
}
}
这个java代码适用于单嵌套查询(best_practice.code
),但它不适用于双重查询。如何将其转换为双嵌套?
public NestedQueryBuilder nestedBoolQuery(final Map<String, String> propertyValues, final String nestedPath) {
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
Iterator<String> iterator = propertyValues.keySet().iterator();
propertyValues.put("work_field.choice_field.key", "B002");
while (iterator.hasNext()) {
String propertyName = iterator.next();
String propertValue = propertyValues.get(propertyName);
MatchQueryBuilder matchQuery = QueryBuilders.matchQuery(propertyName, propertValue);
boolQueryBuilder.must(matchQuery);
}
return QueryBuilders.nestedQuery(nestedPath, boolQueryBuilder);
}
解决方案
请在下面找到查询示例(与我的第一个答案中的逻辑相同,但完全集中在您的索引上)。我在 best_practice.code 和 work_field.choice_field.key 上进行搜索。查询完美运行。使用此示例并将其应用到您的 Java 代码中。应该可以正常工作。
curl -X GET -H "Content-Type:application/json" localhost:9200/stackoverflow_20210207/best_practices/_count -d'
{
"query": {
"bool": {
"must": [
{
"match": {
"best_practice.code.keyword": "A002"
}
},
{
"match": {
"work_field.choice_field.key.keyword": "B078"
}
}
]
}
}
}
' | json_pp
推荐阅读
- c# - 调整窗体大小时在 WinForm UI 上闪烁
- codenameone - 代号一:更新状态锁定
- c - MikroC 中的嵌套调用限制是什么?
- javascript - 如何在Vuerouter中进行“历史模式”推送?
- javascript - 如何使用 es6 在空对象中推送键值
- swift - 更改 UIContextualAction 的文本大小
- java - 如何在 Java 中为现有的 REST 服务实现 SSL?
- jquery - 如何替换数据表插件中的搜索 dom
- javascript - 如何为显示 flex 孩子设置相同的高度?
- apache-spark - Pyspark:为什么加入 spark 数据帧的 show() 或 count() 这么慢?