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).*"
}
}
}
}