我在kibana的Discovers搜索栏中的某些文档字段中搜索到一些重复的结果,我希望每次重复都获得一个唯一的文档。因为我开始使用它,所以我不知道如何使用查询dls来执行此操作。但我需要这样的东西:
任何搜索:
Doc 1 {log: '0701143900', name: '5018', date: '2019/07/01 14:37:41:796'}
Doc 2 {log: '0701143900', name: '5018', date: '2019/07/01 14:37:41:796'}
Doc 3 {log: '0701143900', name: '5018', date: '2019/07/01 14:37:41:796'}
Doc 4 {log: '0701125212', name: '5018', date: '2019/07/01 12:44:58:595'}
Doc 5 {log: '0701125212', name: '5018', date: '2019/07/01 12:44:58:595'}
Doc 6 {log: '0701125212', name: '5018', date: '2019/07/01 12:44:58:595'}
在dsl查询之后,我可以看到此结果(按日期字段的重复数据删除结果)
Doc 3 {log: '0701143900', name: '5018', date: '2019/07/01 14:37:41:796'}
Doc 4 {log: '0701125212', name: '5018', date: '2019/07/01 12:44:58:595'}
(可以是任何文档编号,但没有重复的文档编号)
答案 0 :(得分:0)
在Elasticsearch中,并没有您要查找的SELECT ... DISTINCT
操作类型,但是我们可以接近(有一些警告)。
注意:以下所有内容均在ES 6.8.1上进行了测试,但应该可以追溯到ES 2.x以及直到7.x为止。
有效地,您可以结合两件事:
log
字段足以声明唯一性,这将很容易。如果是字段的某种组合,则将获得nominally trickier with scripting且性能明显下降)假设:
logs
-我在本地将您的记录编入名为logs-2019.07.01
的索引中,并别名为logs
)log
字段进行了keyword
分析(允许对其进行汇总)POST /logs/_search
{
"size": 0,
"aggs": {
"unique_logs": {
"terms": {
"field": "log",
"size": 10
},
"aggs": {
"docs": {
"top_hits": {
"size": 1
}
}
}
}
}
}
这将最多返回10条唯一记录
{
"took" : 2,
...
"aggregations" : {
"unique_logs" : {
...
"buckets" : [
{
"key" : "0701125212",
"doc_count" : 3,
"docs" : {
"hits" : {
"total" : 3,
"max_score" : 1.0,
"hits" : [
{
"_index" : "logs-2019.07.01",
"_type" : "_doc",
"_id" : "x-FB2GsBn6OwEwpDhYjX",
"_score" : 1.0,
"_source" : {
"log" : "0701125212",
"name" : "5018",
"date" : "2019/07/01 12:44:58:595"
}
}
]
}
}
},
{
"key" : "0701143900",
"doc_count" : 3,
"docs" : {
...
}
}
...
}
具有与上述索引/数据相同的假设:
Visualize
构建器Top Hits
作为指标(显示并排序所需的任何字段),并选择Terms
聚合以按doc
字段存储行
Field
。就是这样!现在,根据定义的唯一性标准,您应该有一张表,每条“唯一”记录有一行。
如果您要在唯一性条件中使用多个字段,而又不更改映射/索引,则唯一的选择就是在术语汇总中使用script
而不是"field": "doc"
。在Elasticsearch查询中,这很简单:
POST /logs/_search
{
"size": 0,
"aggs": {
"unique_logs": {
"terms": {
// Remove the "field" from the agg...
// "field": "log",
// ...and add a "script" instead.
"script": {
"source": "String.format('%s.%s', new def[]{doc['log'].value, doc['name'].value})",
"lang": "painless"
},
"size": 10
},
...
}
}
}
在Kibana中,您执行相同的操作,只需单击几下即可到达那里:
Buckets
配置中,从Field
下拉列表中选择新创建的脚本字段。尽管热门匹配汇总支持返回整个匹配,但不幸的是,Kibana数据表可视化仅支持每行显示一个字段。如果要每行显示更多数据,则必须创建一个scripted field,其中包含要显示的数据。
类似于多字段唯一键示例,您可以编写一个脚本来格式化带有某些字段组合的某些字符串:
String.format('[%s] %s - %s', new def[]{doc['log'].value, doc['date'].value, doc['name'].value})