我是Elasticsearch的新手,我无法根据访问范围构建直方图。我甚至不确定是否可以通过在Elasticsearch中使用单个查询来创建这种图表,但我觉得可以使用管道聚合或脚本聚合。
这是我正在使用的测试数据集:
PUT /test_histo
{ "settings": { "number_of_shards": 1 }}
PUT /test_histo/_mapping/visit
{
"properties": {
"user": {"type": "string" },
"datevisit": {"type": "date"},
"page": {"type": "string"}
}
}
POST test_histo/visit/_bulk
{"index":{"_index":"test_histo","_type":"visit"}}
{"user":"John","page":"home.html","datevisit":"2015-11-25"}
{"index":{"_index":"test_histo","_type":"visit"}}
{"user":"Jean","page":"productXX.hmtl","datevisit":"2015-11-25"}
{"index":{"_index":"test_histo","_type":"visit"}}
{"user":"Robert","page":"home.html","datevisit":"2015-11-25"}
{"index":{"_index":"test_histo","_type":"visit"}}
{"user":"Mary","page":"home.html","datevisit":"2015-11-25"}
{"index":{"_index":"test_histo","_type":"visit"}}
{"user":"Mary","page":"media_center.html","datevisit":"2015-11-25"}
{"index":{"_index":"test_histo","_type":"visit"}}
{"user":"John","page":"home.html","datevisit":"2015-11-25"}
{"index":{"_index":"test_histo","_type":"visit"}}
{"user":"John","page":"media_center.html","datevisit":"2015-11-26"}
如果我们考虑范围[1,2[,[2,3[,[3,inf[
预期结果应为:
迄今为止,我一直在努力寻找显示客户访问频率的直方图,但都没有成功。我很高兴能有一些提示、技巧或想法来回答我的问题。
查看此解决方案:
{
"query": {
"match_all": {}
},
"aggs": {
"periods": {
"filters": {
"filters": {
"1-2": {
"range": {
"datevisit": {
"gte": "2015-11-25",
"lt": "2015-11-26"
}
}
},
"2-3": {
"range": {
"datevisit": {
"gte": "2015-11-26",
"lt": "2015-11-27"
}
}
},
"3-": {
"range": {
"datevisit": {
"gte": "2015-11-27",
}
}
}
}
},
"aggs": {
"users": {
"terms": {"field": "user"}
}
}
}
}
}
分步筛选聚合:您可以为下一个聚合定义范围值,在这种情况下,我们基于日期范围筛选定义了3个期间。嵌套用户聚合:此聚合返回的结果与您定义的筛选器一样多。因此,在这种情况下,您将使用范围日期筛选得到3个值,您将得到如下结果:
{
...
"aggregations" : {
"periods" : {
"buckets" : {
"1-2" : {
"users" : {
"buckets" : [
{"key" : XXX,"doc_count" : NNN},
{"key" : YYY,"doc_count" : NNN},
]
}
},
"2-3" : {
"users" : {
"buckets" : [
{"key" : XXX1,"doc_count" : NNN1},
{"key" : YYY1,"doc_count" : NNN1},
]
}
},
"3-" : {
"users" : {
"buckets" : [
{"key" : XXX2,"doc_count" : NNN2},
{"key" : YYY2,"doc_count" : NNN2},
]
}
},
}
}
}
}
试试看,看看效果如何
请看一下:
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-datehistogram-aggregation.html
如果你想在已经固定好的UI中显示它,请使用Kibana。
这样的查询:
GET _search
{
"query": {
"match_all": {}
},
{
"aggs" : {
"visits" : {
"date_histogram" : {
"field" : "datevisit",
"interval" : "month"
}
}
}
}
}
应该给你一个直方图,我现在没有弹性,所以我可能有一些胖手指错别字。
然后,您可以添加查询条件,只显示特定页面的柱状图,您可以有一个A外部聚合桶,其中包含聚合/页面或用户。
像这样的东西:
GET _search
{
"query": {
"match_all": {}
},
{
{
"aggs" : {
"users" : {
"terms" : {
"field" : "user",
},
"aggs" : {
"visits" : {
"date_histogram" : {
"field" : "datevisit",
"interval" : "month"
}
}
}
}
}
有两种方法可以做到这一点。
首先是在ElasticSearch中执行它,这需要脚本度量聚合
。您可以在此处阅读有关它的更多信息。
您的查询如下所示
{
"size": 0,
"aggs": {
"visitors_over_time": {
"date_histogram": {
"field": "datevisit",
"interval": "week"
},
"aggs": {
"no_of_visits": {
"scripted_metric": {
"init_script": "_agg['values'] = new java.util.HashMap();",
"map_script": "if (_agg.values[doc['user'].value]==null) {_agg.values[doc['user'].value]=1} else {_agg.values[doc['user'].value]+=1;}",
"combine_script": "someHashMap = new java.util.HashMap();for(x in _agg.values.keySet()) {value=_agg.values[x];if(value<3){key='[' + value +',' + (value + 1) + '[';}else{key='[' + value +',inf[';}; if(someHashMap[key]==null){someHashMap[key] = 1}else{someHashMap[key] += 1}}; return someHashMap;"
}
}
}
}
}
}
在这里,您可以通过日期、周、月等值更改字段中对象的时间段。
你的回答是这样的
{
"took": 5,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 7,
"max_score": 0,
"hits": []
},
"aggregations": {
"visitors_over_time": {
"buckets": [
{
"key_as_string": "2015-11-23T00:00:00.000Z",
"key": 1448236800000,
"doc_count": 7,
"no_of_visits": {
"value": [
{
"[2,3[": 1,
"[3,inf[": 1,
"[1,2[": 2
}
]
}
}
]
}
}
}
第二种方法是在客户端使用脚本化的度量。您可以使用术语聚合的结果。你可以在这里了解更多。
您的查询将如下所示:GET test\u histor/visit/\u search
{
"size": 0,
"aggs": {
"visitors_over_time": {
"date_histogram": {
"field": "datevisit",
"interval": "week"
},
"aggs": {
"no_of_visits": {
"terms": {
"field": "user",
"size": 10
}
}
}
}
}
}
答案是
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 7,
"max_score": 0,
"hits": []
},
"aggregations": {
"visitors_over_time": {
"buckets": [
{
"key_as_string": "2015-11-23T00:00:00.000Z",
"key": 1448236800000,
"doc_count": 7,
"no_of_visits": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "john",
"doc_count": 3
},
{
"key": "mary",
"doc_count": 2
},
{
"key": "jean",
"doc_count": 1
},
{
"key": "robert",
"doc_count": 1
}
]
}
}
]
}
}
}
在响应中,您可以对每个时段的每个文档计数进行计数。
问题内容: 到目前为止,我们使用了几个Linux用户: system_foo @ server system_bar @服务器 … 我们希望将系统用户放入docker容器中。 linux用户->容器 服务器内部的更改没有问题,但是远程系统使用这些用户向我们发送数据。 我们需要工作。远程系统无法更改。 如果每个linux操作系统只有一个系统(将端口22传递到容器),我将非常容易。但是有几个。 我们如
我在运行elasticsearch的服务器上通过80代理了端口9200。我有一个骆驼路由,需要将文档索引到此服务器。 camel elasticsearch插件是否支持该功能?ie通过非9300端口访问弹性搜索? 我知道端口9300使用本机elasticsearch传输协议。 我的选择是什么?我可以通过apache代理9300吗?我不确定这是否有效。 还是camel elasticsearch插件
我刚刚开始了解弹性搜索,我想知道它是否适合我的情况: 考虑一个系统,公司(有多名员工)可以注册和管理他们的客户,并向他们的客户发送文件。 现在,我想让公司能够搜索他们的文档,但只搜索他们的文档,而不是其他公司的文档。换言之:如何分离这些公司的数据进行搜索?如何使用elasticsearch实现这一点? 这种分离是由elasticsearch本身处理的吗?一、 e.我的系统中的公司和elastics
问题内容: 我使用Docker Compose运行了一个简单的Elasticsearch实例: 我可以使用localhost从浏览器访问它,但是当我运行我的应用程序并连接到它时,遇到了一些问题。从我能够跟踪到的内容来看,应用程序似乎成功连接到Elasticsearch实例,然后解析了它绑定的IP,然后使用该IP地址与Elasticsearch实例进行通信。 来自Fiddler: http://10
问题内容: 我积极使用脚本进行评分和汇总。我不知道的一件事是如何从脚本发出日志。我尝试了console.log,但后来没有成功。请让我知道,我该如何从常规脚本中发出日志。 问题答案: 这可以通过访问全局Elasticsearch记录器实例来完成。下面提供了它的常规示例。您也应该能够对javascript和其他脚本语言执行类似的操作。 因此,当您进行条款汇总时,可以执行以下操作- 一些来自Elast
问题内容: 我正在尝试直接为嵌入式Linux项目访问物理内存,但是我不确定如何最好地指定使用的内存。 如果我定期引导设备并访问/ dev / mem,则可以轻松地对其几乎任何位置进行读写。但是,在这种情况下,我正在访问可以轻松分配给任何进程的内存。我不想做 我的/ dev / mem代码是(删除了所有错误,等等。): 这可行。但是,我想使用没有其他人会碰到的内存。我尝试通过使用mem = XXXm