【问题标题】:ElasticSearch: Restrict Aggregations to Query StringElasticSearch:将聚合限制为查询字符串
【发布时间】:2019-02-04 21:38:55
【问题描述】:

我正在努力将我的聚合限制在我的查询中。 我当然试过了:

{
    "_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
      }
    }
  }

【问题讨论】:

  • 您的查询是正确的。这将根据您的查询字符串获取文档,然后所有聚合将运行这组文档。
  • @NishantSaini 不管怎么查询结果都是一样的,而且我有很多用户。
  • 您能否添加可以复制问题的最小且可验证的示例,因为我没有看到查询有任何问题。还有你用的是什么版本的elasticsearch?
  • 不确定我还能合法提供什么,但我们使用的是 6.4。
  • 如果您可以添加一些示例文档(2 或 3),如果我运行上述查询,它会给出预期的结果。

标签: elasticsearch elasticsearch-aggregation elasticsearch-query


【解决方案1】:

找到我的答案! 问题似乎是由查询burger.user_nametext 字段而不是keyword 字段引起的:burger.user_name.keyword。 将我的 query_string 更改为对每个文本字段使用 keyword 解决了我的问题。

{
    "_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 给出了一个很好的简短解释。

【讨论】:

    猜你喜欢
    • 2015-05-07
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 2022-01-18
    • 2012-04-25
    • 2021-05-24
    • 1970-01-01
    • 2014-06-03
    相关资源
    最近更新 更多