Elasticsearch: запускать агрегацию на поле и отфильтровывать определенные значения, используя регулярные выражения, не соответствующие значениям

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

{
   "size": 0,
   "aggs": {
      "paths": {
            "terms":{
               "field": "path" // Count the no unique path ~> values
            }

      }
   },
   "filter": {
      "bool": {
         "must_not": [
            {
               "regexp": {
                  // path MUST NOT CONTAIN media | cache
                  "path": {
                    "value": "(\/media\b|\bcache\b)"
                  }
               }
            }
         ]
      }
   }
}

При запуске это не отфильтровывает документы, которые имеют путь, который содержит кэш или носитель?!

Если я уберу фильтр, будут возвращены те же результаты, если я его оставлю.

1 ответ

Решение

Вы можете попытаться исключить эти значения внутри агрегирования терминов, как это

{
  "size": 0,
  "aggs": {
    "path": {
      "terms": {
        "field": "path",
        "exclude": ".*(media|cache).*"
      }
    }
  }
}

Осторожно: из документации

Примечание. Производительность запроса регулярного выражения в значительной степени зависит от выбранного регулярного выражения. Совпадение всего, как.* Очень медленное, а также использование регулярных выражений. Если возможно, вы должны попытаться использовать длинный префикс, прежде чем ваше регулярное выражение начинается

Другой подход заключается в том, чтобы избавиться от этих документов на этапе запроса, чтобы можно было переместить фильтр на запрос и затем объединить оставшиеся результаты.

РЕДАКТИРОВАТЬ: с фильтром даты

Вы можете добавить фильтр даты в запрос, чтобы получить результаты только за прошедший день, что-то вроде этого будет работать.

{
  "query": {
    "range": {
      "name_of_date_field": {
        "gte": "now-1d"
      }
    }
  },
  "size": 0,
  "aggs": {
    "path": {
      "terms": {
        "field": "path",
        "exclude": ".*(media|cache).*"
      }
    }
  }
}
Другие вопросы по тегам