ElasticSearch:将聚合限制为查询字符串
ElasticSearch: Restrict Aggregations to Query String
我正在努力让我的聚合仅限于我的查询。
我当然试过了:
{
"_source": ["burger.id", "burger.user_name", "burger.timestamp"],
"query": {
"query_string": {
"query": "burger.user_name:Bob"
}
},
"aggs": {
"burger_count": {
"cardinality": {
"field": "burger.id.keyword"
}
},
"min_dtm": {
"min": {
"field": "burger.timestamp"
}
},
"max_dtm": {
"max": {
"field": "burger.timestamp"
}
}
}
}
我非常喜欢使用 "query_string" 进行过滤,因为我们有一个非常好的前端,允许用户轻松构建查询,然后将其转换为 "query_string."
不幸的是,我还没有找到一种方法来组合 query_string 和聚合,以便聚合仅覆盖查询结果!
我已经通读了 很多 SO 帖子关于这样做的内容,但是它们都非常陈旧和过时,因为它们都建议过时的过滤查询方式,但即使那样'实施 query_string.
更新
以下是一些示例文档。
看来我的结果没有被我的查询过滤。有没有我缺少的设置?
我还将所有字段更改为与汉堡有关...
{
"_index": "burgers",
"_type": "burger",
"_id": "123",
"_score": 5.3759894,
"_source": {
"inference": {
"id": "1",
"user_name": "Jonathan",
"timestamp": 1541521691847
}
}
},
{
"_index": "burgers",
"_type": "burger",
"_id": "456",
"_score": 5.3759894,
"_source": {
"inference": {
"id": "2",
"user_name": "Ryan",
"timestamp": 1542416601153
}
}
},
{
"_index": "burgers",
"_type": "burger",
"_id": "789",
"_score": 5.3759894,
"_source": {
"inference": {
"id": "3",
"user_name": "Grant",
"timestamp": 1542237715511
}
}
}
找到我的答案!
问题似乎是由查询 burger.user_name
的 text 字段而不是 keyword 字段引起的:burger.user_name.keyword
。
将我的 query_string 更改为对每个文本字段使用 关键字 解决了我的问题。
{
"_source": ["burger.id", "burger.user_name", "burger.timestamp"],
"query": {
"query_string": {
"query": "burger.user_name.keyword:Bob"
}
},
"aggs": {
"burger_count": {
"cardinality": {
"field": "burger.id.keyword"
}
},
"min_dtm": {
"min": {
"field": "burger.timestamp"
}
},
"max_dtm": {
"max": {
"field": "burger.timestamp"
}
}
}
}
This SO answer 给出了一个很好的、简短的解释。
我正在努力让我的聚合仅限于我的查询。 我当然试过了:
{
"_source": ["burger.id", "burger.user_name", "burger.timestamp"],
"query": {
"query_string": {
"query": "burger.user_name:Bob"
}
},
"aggs": {
"burger_count": {
"cardinality": {
"field": "burger.id.keyword"
}
},
"min_dtm": {
"min": {
"field": "burger.timestamp"
}
},
"max_dtm": {
"max": {
"field": "burger.timestamp"
}
}
}
}
我非常喜欢使用 "query_string" 进行过滤,因为我们有一个非常好的前端,允许用户轻松构建查询,然后将其转换为 "query_string."
不幸的是,我还没有找到一种方法来组合 query_string 和聚合,以便聚合仅覆盖查询结果!
我已经通读了 很多 SO 帖子关于这样做的内容,但是它们都非常陈旧和过时,因为它们都建议过时的过滤查询方式,但即使那样'实施 query_string.
更新
以下是一些示例文档。 看来我的结果没有被我的查询过滤。有没有我缺少的设置? 我还将所有字段更改为与汉堡有关...
{
"_index": "burgers",
"_type": "burger",
"_id": "123",
"_score": 5.3759894,
"_source": {
"inference": {
"id": "1",
"user_name": "Jonathan",
"timestamp": 1541521691847
}
}
},
{
"_index": "burgers",
"_type": "burger",
"_id": "456",
"_score": 5.3759894,
"_source": {
"inference": {
"id": "2",
"user_name": "Ryan",
"timestamp": 1542416601153
}
}
},
{
"_index": "burgers",
"_type": "burger",
"_id": "789",
"_score": 5.3759894,
"_source": {
"inference": {
"id": "3",
"user_name": "Grant",
"timestamp": 1542237715511
}
}
}
找到我的答案!
问题似乎是由查询 burger.user_name
的 text 字段而不是 keyword 字段引起的:burger.user_name.keyword
。
将我的 query_string 更改为对每个文本字段使用 关键字 解决了我的问题。
{
"_source": ["burger.id", "burger.user_name", "burger.timestamp"],
"query": {
"query_string": {
"query": "burger.user_name.keyword:Bob"
}
},
"aggs": {
"burger_count": {
"cardinality": {
"field": "burger.id.keyword"
}
},
"min_dtm": {
"min": {
"field": "burger.timestamp"
}
},
"max_dtm": {
"max": {
"field": "burger.timestamp"
}
}
}
}
This SO answer 给出了一个很好的、简短的解释。