Запрос в Kibana не возвращает журналы с регулярным выражением

#elasticsearch #kibana #querydsl

#elasticsearch #kibana #querydsl

Вопрос:

У меня есть поле с именем log.file.path в Elasticsearch, и оно имеет /var/log/dev-collateral/uaa.2020-09-26.log значение, я попытался получить все журналы log.file.path , с которых начинается это поле /var/log/dev-collateral/uaa , я использовал приведенное ниже регулярное выражение, но оно не работает.

 {
    "regexp":{
        "log.file.path": "/var/log/dev-collateral/uaa.*"
    }
}
  

Ответ №1:

Давайте посмотрим, почему это не работает? Я проиндексировал два документа, используя интерфейс Kibana, как показано ниже —

 PUT myindex/_doc/1
{
  "log.file.path" : "/var/log/dev-collateral/uaa.2020-09-26.log"
}

PUT myindex/_doc/2
{
  "log.file.path" : "/var/log/dev-collateral/uaa.2020-09-26.txt"
}
  

Когда я пытаюсь увидеть токены для текста в log.file.path поле с помощью _analyze API

 POST _analyze
{
  "text": "/var/log/dev-collateral/uaa.2020-09-26.log"
}
  

Это дает мне,

 {
  "tokens" : [
    {
      "token" : "var",
      "start_offset" : 1,
      "end_offset" : 4,
      "type" : "<ALPHANUM>",
      "position" : 0
    },
    {
      "token" : "log",
      "start_offset" : 5,
      "end_offset" : 8,
      "type" : "<ALPHANUM>",
      "position" : 1
    },
    {
      "token" : "dev",
      "start_offset" : 9,
      "end_offset" : 12,
      "type" : "<ALPHANUM>",
      "position" : 2
    },
    {
      "token" : "collateral",
      "start_offset" : 13,
      "end_offset" : 23,
      "type" : "<ALPHANUM>",
      "position" : 3
    },
    {
      "token" : "uaa",
      "start_offset" : 24,
      "end_offset" : 27,
      "type" : "<ALPHANUM>",
      "position" : 4
    },
    {
      "token" : "2020",
      "start_offset" : 28,
      "end_offset" : 32,
      "type" : "<NUM>",
      "position" : 5
    },
    {
      "token" : "09",
      "start_offset" : 33,
      "end_offset" : 35,
      "type" : "<NUM>",
      "position" : 6
    },
    {
      "token" : "26",
      "start_offset" : 36,
      "end_offset" : 38,
      "type" : "<NUM>",
      "position" : 7
    },
    {
      "token" : "log",
      "start_offset" : 39,
      "end_offset" : 42,
      "type" : "<ALPHANUM>",
      "position" : 8
    }
  ]
}
  

Вы можете видеть, что Elasticsearch разделил ваш вводимый текст на токены, когда вы вставляете их в свой индекс. Это потому, что elasticsearch использует стандартный анализатор, когда мы индексируем документы, и он разбивает наш документ на небольшие части в качестве токена, Удаляет знаки препинания, строчный текст и т. Д. Вот почему ваш текущий запрос регулярного выражения не работает.

 GET myindex/_search
{
  "query": {
    "match": {
      "log.file.path": "var"
    }
  }
}
  

Если вы попробуете этот способ, это сработает, но для вашего случая вам нужно сопоставить каждый log.file.путь, заканчивающийся на .log Итак, что теперь делать? Просто не применяйте анализаторы при индексации документов. Ключевое слово type хранит предоставленную вами строку как есть.

Создайте сопоставление с keyword типом,

 PUT myindex2/
{
  "mappings": {
    "properties": {
      "log.file.path": {
        "type": "keyword"
      }
    }
  }
}
  

Индексировать документы,

 PUT myindex2/_doc/1
{
  "log.file.path" : "/var/log/dev-collateral/uaa.2020-09-26.log"
}

PUT myindex2/_doc/2
{
  "log.file.path" : "/var/log/dev-collateral/uaa.2020-09-26.txt"
}
  

Поиск с regexp помощью,

 GET myindex2/_search
{
  "query": {
    "regexp": {
      "log.file.path": "/var/log/dev-collateral/uaa.2020-09-26.*"
    }
  }
}
  

Ответ №2:

Я использовал этот запрос, и он работает!

 {
  "query": {
    "regexp": {
      "log.file.path.keyword": {
        "value": "/var/log/dev-collateral/uaa.*",
        "flags": "ALL",
        "max_determinized_states": 10000,
        "rewrite": "constant_score"
      }
    }
  }
}