Регулярное выражение ElasticSearch для пути - PullRequest
0 голосов
/ 07 мая 2020

До сих пор я использовал запрос, который соответствовал бы путям и получал агрегаты этих путей:

{
  "query": {
    "terms": {
      "path.keyword": [
        "/api/v1.0/cc-dashboard/aggregated",
        "/api/v1.1/cc-dashboard/aggregated",
        "/api/v1.2/cc-dashboard/aggregated",
        "/api/v1.3/cc-dashboard/aggregated"
      ]
    }
  },
  "size": 0,
  "aggs": { ...

Поскольку единственная разница между путями - это номер версии (который постоянно меняется), я подумал о используя запрос Regexp. В обычном регулярном выражении я бы поискал \/api\/v1\.\d\/cc-dashboard\/aggregated. Я знаю, что ElasticSearch использует для этого разные зарезервированные символы, и я перепробовал все, что знаю, но поиск возвращается без совпадений. Есть мысли?

1 Ответ

1 голос
/ 07 мая 2020

Я думаю, здесь есть пара вещей, на которые следует обратить внимание. Сначала убедитесь, что path.keyword действительно относится к типу «ключевое слово», иначе у вас возникнут проблемы с сопоставлением b / c, которое вы действительно пытаетесь сопоставить с токенами, и Elasticsearch разделится на /. Во-вторых, не похоже, что Elasticsearch поддерживает \d для выхода для di git, но позволяет [0-9]. В-третьих, чтобы избежать ., мне пришлось использовать две обратные косые черты \\.

Итак, теперь все вместе:

PUT /stackoverflow
{
  "mappings": {
    "properties": {
      "path.keyword": {
        "type": "keyword"
      }
    }
  }
}

POST /stackoverflow/_doc/1
{
  "path.keyword": "/api/v1.0/cc-dashboard/aggregated"
}

POST /stackoverflow/_doc/2
{
  "path.keyword": "/api/v1.1/cc-dashboard/aggregated"
}

POST /stackoverflow/_doc/3
{
  "path.keyword": "/api/not/cc-dashboard/aggregated"
}

GET /stackoverflow/_search

GET /stackoverflow/_search
{
  "query": {
    "regexp": {
      "path.keyword": {
        "value": "/api/v1\\.[0-9]/cc-dashboard/aggregated"
      }
    }
  }
}

DELETE /stackoverflow
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...