Elasticsearch:如何找到某种类型的所有文档中都存在的术语?

时间:2015-05-17 16:01:44

标签: elasticsearch kibana-4

假设我有一个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中定义这样的查询?

1 个答案:

答案 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中再次说EB。运行查询然后返回A,但我希望同时获得AB

您可以增加聚合的size;但我知道解决方案并不是很好,因为你不知道有多少聚合符合你的总数。也许查看sum_other_doc_count有助于弄清楚是否有更多数据。