【问题标题】:elasticsearch Saved Search with Group byelasticsearch 使用 Group by 保存搜索
【发布时间】:2020-12-07 11:00:27
【问题描述】:
index_name: my_data-2020-12-01
ticket_number: T123 
ticket_status: OPEN 
ticket_updated_time: 2020-12-01 12:22:12   

index_name: my_data-2020-12-01 
ticket_number: T124 
ticket_status: OPEN 
ticket_updated_time: 2020-12-01 12:32:11   

index_name: my_data-2020-12-02 
ticket_number: T123 
ticket_status: INPROGRESS 
ticket_updated_time: 2020-12-02 12:33:12   

index_name: my_data-2020-12-02 
ticket_number: T125 
ticket_status: OPEN 
ticket_updated_time: 2020-12-02 14:11:45

我想创建一个按票号字段分组的已保存搜索,以获取具有最新票证状态 (ticket_status) 的唯一文档。有可能吗?

【问题讨论】:

  • 您能分享一下您预期的搜索结果吗?

标签: elasticsearch kibana elasticsearch-dsl


【解决方案1】:

您可以简单地再次查询,我假设您使用 Kibana 进行可视化。在您的查询中,您需要根据ticket_number 进行过滤并根据ticket_updated_time 进行排序。

工作示例

索引映射

{
    "mappings": {
        "properties": {
            "ticket_updated_time": {
                "type": "date"
            },
            "ticket_number" :{
                "type" : "text"
            },
            "ticket_status" : {
                "type" : "text"
            }
        }
    }
}

索引示例文档

{
    "ticket_number": "T123",
    "ticket_status": "OPEN",
    "ticket_updated_time": "2020-12-01T12:22:12"
}

{
    "ticket_number": "T123",
    "ticket_status": "INPROGRESS",
    "ticket_updated_time": "2020-12-02T12:33:12"
}

现在您可以看到,两个示例文档属于同一个ticket_number,但状态和更新时间不同。

搜索查询

{
    "size" : 1, // fetch only the latest status document, if you remove this, will get other ticket with different status.
    "query": {
        "bool": {
            "filter": [
                {
                    "match": {
                        "ticket_number": "T123"
                    }
                }
            ]
        }
    },
    "sort": [
        {
            "ticket_updated_time": {
                "order": "desc"
            }
        }
    ]
}

以及搜索结果

"hits": [
            {
                "_index": "65180491",
                "_type": "_doc",
                "_id": "2",
                "_score": null,
                "_source": {
                    "ticket_number": "T123",
                    "ticket_status": "INPROGRESS",
                    "ticket_updated_time": "2020-12-02T12:33:12"
                },
                "sort": [
                    1606912392000
                ]
            }
        ]

【讨论】:

  • 如何创建可视化(饼图)?
  • @Kapila,您可以自己尝试,所以请提出一个专门针对 Kibana 可视化的后续问题,但相同的查询(由我发布)回答了您的原始问题,并将有助于创建可视化(因为它取决于后端的搜索查询)
  • 我明白,但我原来的问题的意思是在发现中保存搜索,而不是使用搜索 API。
  • @Kapila 是的,我对 Kibana 没有太多经验,但如前所述,您可以提出后续问题并获得社区成员的回复
【解决方案2】:

如果您需要按ticket_number 字段分组,那么您也可以使用聚合

索引映射:

{
  "mappings": {
    "properties": {
      "ticket_updated_time": {
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss"
      }
    }
  }
}

搜索查询:

 {
  "size": 0,
  "aggs": {
    "unique_id": {
      "terms": {
        "field": "ticket_number.keyword",
        "order": {
          "latestOrder": "desc"
        }
      },
      "aggs": {
        "latestOrder": {
          "max": {
            "field": "ticket_updated_time"
          }
        }
      }
    }
  }
}

搜索结果:

"buckets": [
        {
          "key": "T125",
          "doc_count": 1,
          "latestOrder": {
            "value": 1.606918305E12,
            "value_as_string": "2020-12-02 14:11:45"
          }
        },
        {
          "key": "T123",
          "doc_count": 2,
          "latestOrder": {
            "value": 1.606912392E12,
            "value_as_string": "2020-12-02 12:33:12"
          }
        },
        {
          "key": "T124",
          "doc_count": 1,
          "latestOrder": {
            "value": 1.606825931E12,
            "value_as_string": "2020-12-01 12:32:11"
          }
        }
      ]

【讨论】:

  • 如何创建可视化(饼图)?
猜你喜欢
  • 2021-08-28
  • 1970-01-01
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多