ElasticSearch:将聚合限制为查询字符串

时间:2019-01-31 19:40:36

标签: elasticsearch elasticsearch-aggregation elasticsearch-query

我努力让我的集合被限制到我的查询。 我当然尝试过:

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

1 个答案:

答案 0 :(得分:0)

找到了我的答案! 看来此问题是由于查询burger.user_name text 字段而不是查询{strong> 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很好地解释了原因。