Elasticsearch:在数组中聚合不同的值

时间:2017-09-10 13:40:50

标签: elasticsearch

我使用Elasticsearch存储点击流量,每行包含已访问过的网页主题。典型的行如下所示:

{
  "date": "2017-09-10T12:26:53.998Z",
  "pageid": "10263779",
  "loc_ll": [
    -73.6487,
    45.4671
  ],
  "ua_type": "Computer",
  "topics": [
    "Trains",
    "Planes",
    "Electric Cars"
  ]
}

我希望每个topics都是关键字,因此如果我搜索cars,则不会返回任何内容。只有Electric Cars会返回结果。

我还想对所有行中的所有主题运行不同的查询,因此我列出了所有使用的主题。

pageid上执行此操作将如下所示,但我不确定如何为topics数组处理此问题。

{
  "aggs": {
    "ids": {
      "terms": {
        "field": pageid,
        "size": 10
      }
    }
  }
}

2 个答案:

答案 0 :(得分:1)

您查询和获取可用条款的方法看起来很好。可能你应该检查你的映射。如果您获得cars的结果,则表示topics的映射是已分析的字符串(例如,类型text而不是keyword)。因此,请检查此字段的映射。

PUT keywordarray
{
  "mappings": {
    "item": {
      "properties": {
        "id": {
          "type": "integer"
        },
        "topics": {
          "type": "keyword"
        }
      }
    }
  }
}

使用此示例数据

POST keywordarray/item
{
  "id": 123,
  "topics": [
    "first topic", "second topic", "another"
  ]
}

和这个聚合:

GET keywordarray/item/_search
{
  "size": 0,
  "aggs": {
    "topics": {
      "terms": {
        "field": "topics"
      }
    }
  }
}

将导致:

"aggregations": {
  "topics": {
    "doc_count_error_upper_bound": 0,
    "sum_other_doc_count": 0,
    "buckets": [
      {
        "key": "another",
        "doc_count": 1
      },
      {
        "key": "first topic",
        "doc_count": 1
      },
      {
        "key": "second topic",
        "doc_count": 1
      }
    ]
  }
}

答案 1 :(得分:0)

这是非常有益的问题。只需将映射类型更改为keyword,即可实现我的目标。

我的一部分认为它会将数组连接成一个字符串。但它并没有

{
  "mappings": {
    "view": {
      "properties": {
        "topics": {
          "type": "keyword"
        },...
      }
    }
  }
}

之类的搜索查询
{
  "aggs": {
    "ids": {
      "terms": {
        "field": pageid,
        "size": 10
      }
    }
  }
}

将返回字段数组中所有元素的不同列表。