我使用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
}
}
}
}
答案 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
}
}
}
}
将返回字段数组中所有元素的不同列表。