我想根据存在的字段运行任何查询/过滤器。在我们的情况下,如果用户回答特定字段,那么只有我们将存储该值,否则将不会存储该字段。我该如何运行查询?
以下是我的映射:
"mappings": {
"responses_10_57": {
"properties": {
"rid: {
"type": "long"
},
"end_time": {
"type": "date",
"format": "dateOptionalTime"
},
"start_time": {
"type": "date",
"format": "dateOptionalTime"
},
"qid_1": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"analyzer": "str_params"
}
}
},
"qid_2": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"analyzer": "str_params"
}
}
},
"qid_3": {
"properties": {
"msg_text": {
"type": "string"
},
"msg_tags": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"analyzer": "str_params"
}
}
}
}
}
}
}
}
qid_1是名称字段,qid_2是类别字段,qid_3是文本消息字段。
但是qid_3不是必填字段。因此,如果用户未输入任何短信,我们将不会插入记录。
1)我希望每个类别都能计算那些回复第三个问题的人。
2)我必须搜索回答第三个问题的姓名。
如何编写这两个查询?
答案 0 :(得分:0)
两个查询都应该有exists filter来限制只响应qid_3存在的文档(不为空)的响应。对于您的第一个查询,您可以尝试terms aggregation。对于第二个查询,您可以过滤来源,仅包含回复中的名称或store the field并使用fields。
1)
val pt = new PatriciaTrie[String]()
val method = pt.getClass.getSuperclass.getDeclaredMethod("floorEntry", classOf[Object])
method.setAccessible(true)
// and then for retrieving the entry for floor(key)
val entry = method.invoke(pt, key).asInstanceOf[Entry[String, String]]
2)
{
"size": 0,
"filter" : {
"exists" : { "field" : "quid_3" }
},
"aggs" : {
"group_by_category" : {
"terms" : { "field" : "qid_2" }
}
}
}