Elasticsearch,查找没有匹配值的文档

时间:2020-03-03 08:16:41

标签: elasticsearch elasticsearch-aggregation

编辑:简化了我的问题

我有事件日志流到单个Elasticsearch索引“日志”中。

这些事件日志中的每一个都代表长时间运行过程中的单个事件。事件日志的状态为“已排队”->“初始化”->“运行”->“已完成”。

现在,我想查询正在运行的作业的索引...但是,如果我搜索status =“ running”,我还将获得稍后完成的作业。作为人类,我会寻找带有“运行中”事件但没有“完成”事件的日志。

说我不得不耙树叶,打扫房子,然后吃午餐。我的事件日志如下: 即

{job: "rake leaves" status: "queued"}
{job: "clean house" status: "queued"}
{job: "eat lunch" status: "queued"}
{job: "rake leaves" status: "started"}
{job: "rake leaves" status: "running"}
{job: "rake leaves" status: "finished"}
{job: "clean house" status: "started"}
{job: "clean house" status: "finished"}
{job: "clean house" status: "running"}
{job: "eat lunch" status: "started"}
{job: "eat lunch" status: "running"}

如何查找尚未完成的正在运行的作业?在这种情况下,请吃午餐 是唯一正在运行的工作。我将对此进行扩展,以查找尚未开始的排队作业。状态无关紧要。

我目前的思路是使用反向嵌套聚合来冒充所有状态,然后从那里过滤掉我不想要的项目。我也可能会误用min_doc_count这个术语聚合器来获取所需的信息。

示例

    curl -H "Content-Type: application/json" -XPUT "http://localhost:9200/jobs/" -d'
    {
       "mappings": {
          "event": {
             "properties": {
                "name": {
                   "type": "keyword"
                },
                "status": {
                   "type": "keyword"
                }
             }
          }
       }
    }'
  • 一些样本数据

    curl -H "Content-Type: application/json" -XPOST "http://localhost:9200/jobs/_bulk" -d'
    {"index":{"_index":"jobs","_type":"event"}}
    {"name":"job0", "status":"init"}
    {"index":{"_index":"jobs","_type":"event"}}
    {"name":"job1", "status":"init"}
    {"index":{"_index":"jobs","_type":"event"}}
    {"name":"job2", "status":"init"}
    {"index":{"_index":"jobs","_type":"event"}}
    {"name":"job0", "status":"running"}
    {"index":{"_index":"jobs","_type":"event"}}
    {"name":"job1", "status":"running"}
    {"index":{"_index":"jobs","_type":"event"}}
    {"name":"job0", "status":"finished"}
    '
  • 样本查询
    curl -H "Content-Type: application/json" -XGET http://localhost:9200/logs/event/_search -d'
    {
        "aggs": {
            "duplicateNames": {
                "terms": {
                    "field": "name",
                    "min_doc_count": 2
                }
            }
        }
    }' | python -m json.tool

1 个答案:

答案 0 :(得分:0)

所以,说实话!我确实了解上下文和所有内容。但是,我不太明白你的问题。您要在这里实现的目标是什么?

也许在您的结尾(很好的解释:D),将问题清楚地放在结尾。 :)