Elasticsearch, найти документы без соответствующих документов, содержащих значение - PullRequest
0 голосов
/ 03 марта 2020

Редактировать: Упростил мой вопрос

У меня есть журналы событий, передаваемые в один «журнал» индекса эластичного поиска.

Каждый из этих журналов представляет одно событие в каком-то длительном процессе. Журнал событий имеет статус скажем со значениями queued-> init-> 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 голосов
/ 03 марта 2020

Итак, если честно! Я понимаю контекст и все. но я не совсем понимаю ваш вопрос. Какую цель вы хотите достичь здесь?

Может быть, в конце вашего (красиво сделанного объяснения: D) ясно поставьте вопрос в конце. :)

...