假设我有一个type1
类型,其中一个字段是数组:
curl -XPUT localhost:9200/index1/type1/1
{
'field1': ['A', 'B', 'C'],
'field2': 1
}
curl -XPUT localhost:9200/index1/type1/2
{
'field1': ['A', 'E', 'D'],
'field2': 2
}
我想在field1
中查询该类型的所有文档中常见的值。因此,在这种情况下,查询将返回'A'
。
有没有办法用elasticsearch查询做到这一点?如果我还想添加另一个字段的条件怎么办?
最后,有没有办法在Kibana 4中定义这样的查询?
答案 0 :(得分:1)
我认为这不是你要求的,但它可以 mis 用于它:你可以在field1
上使用Term Aggregation并知道有多少文档你完全知道每个文件都有哪一个。
我正在重新粘贴您的查询,更容易在Sense
中使用它们索引:
PUT i30288948/type1/1
{
"field1": ["A", "B", "C"],
"field2": 1
}
PUT i30288948/type1/2
{
"field1": ["A", "E", "D"],
"field2": 2
}
查询:
POST i30288948/_search?search_type=count
{
"aggs": {
"terms": {
"terms": {
"field": "field1",
"size": 1
}
}
}
}
结果:
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 0,
"hits": []
},
"aggregations": {
"terms": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 4,
"buckets": [
{
"key": "a",
"doc_count": 2
}
]
}
}
}
通过了解2
的总数并比较doc_count
,可以回答您的问题。
这是否适合你想要的Kibana我很遗憾无法回答。
更新至第一条评论:
我理解解决方案一般不满意,但可以解决。你说:
首先,我需要事先知道计数。
您可以将总计数作为hits.total
的一部分;我没有将它包含在原始结果粘贴中;它现在是完整的回应。通过比较,你会知道它是否会影响所有人。
但更重要的是 - 它并没有让我得到所有物品。在项目2中再次说
E
我B
。运行查询然后返回A
,但我希望同时获得A
和B
。
您可以增加聚合的size
;但我知道解决方案并不是很好,因为你不知道有多少聚合符合你的总数。也许查看sum_other_doc_count
有助于弄清楚是否有更多数据。