Kibana Query DSL: как применить фильтр регулярного выражения к полю текстового значения, которое содержит синтаксис JSON - PullRequest
0 голосов
/ 14 июля 2020

У меня есть доступ к данным экземпляра elasticsearch с помощью Kibana.

В данных есть текстовое поле, которое содержит строку.

Эта строка (текстовое поле) выглядит как JSON но это не так.

Вот и разница (ПОЖАЛУЙСТА, ОБРАТИТЕСЬ НА клавишу «сообщение» в JSON):

Если вы развернете документ, чтобы увидеть «развернутый документ» с маленьким значком «открытая папка», вы можете выбрать две вкладки «Таблица» и «JSON».

Выберите «JSON ".

Тогда вы увидите следующее:

{
    "_index": "kibana_sample_data",
    "_type": "_doc",
    "_id":"someString",
    "_version": 1,
    "_score": null,
    "_source":{
        "first_key":"some string",
        "message": 
        "{
          \"length\": 11.99,
          \"percentage\": 0,
          \"name\": \"foo\",
          \"category\": \"bar\",
          \"sub_msg\": \"M001: This is a message-code.\"
        }"
    }                
}

Как видите, значение ключа сообщения, которое должно быть JSON, является просто строкой, и все ключи и информация о значениях экранирована (кроме числовых значений).

Чтобы легко выбрать его с помощью фильтра GUI, я должен увидеть JSON, например:

{
    "_index": "kibana_sample_data",
    "_type": "_doc",
    "_id":"someString",
    "_version": 1,
    "_score": null,
    "_source":{
        "first_key":"some string",
        "message": 
        {
          "length": 11.99,
          "percentage": 0,
          "name": "foo",
          "category": "bar",
          "sub_msg": "M001: This is a message-code"
        }
    }                
}

Сейчас я пытаюсь извлечь значение ключа "sub_msg" , используя Query DSL и регулярное выражение. Но я даже не могу найти все совпадения с правильным начальным символом значения ключа сообщения (строки).

Более подробно часть DSL Elasti c Search Query:

{
  "query": {
    "regexp": {
      "message": "{.*"
    }
  }
}

Но поиск ничего не соответствует.

Что действительно совпадает, так это если я попытаюсь найти ключи в сообщении следующим образом:

{
  "query": {
    "regexp": {
      "message": "sub_msg"
    }
  }
}

Что я могу not do - это поиск соответствующего значения в сообщении, например:

{
  "query": {
    "regexp": {
      "message": "M001: This is a message-code"
    }
  }
}

Моя настоящая цель - запросить код сообщения журнала, например "M001:. *" в пределах значения клавиши "sub_msg" . С этими результатами запроса я хотел бы создать простую панель управления.

К сожалению, я чувствую, что сейчас нахожусь в тупике.

Я также пробовал такие вещи, как экранирование escape-символов значения добавив несколько символов "\" к фактическим обратным косым чертам в Query DSL. Это вызывает исключение в Кибане.

1 Ответ

0 голосов
/ 14 июля 2020

Проблема в том, что ваша json -подобная строка была лишена специальных символов, поскольку она была проиндексирована, предположительно из-за анализатора standard по умолчанию, который применяется к текстовым полям, если вы явно не предоставили другой анализатор. Подробнее здесь и здесь .

Вы можете проверить, что станет с вашим message после стандартного анализатора, используя это:

GET _analyze
{
  "text": "{\"length\": 11.99, \"percentage\": 0, \"name\": \"foo\", \"category\": \"bar\",\"sub_msg\": \"M001: This is a message-code.\"}",
  "analyzer": "standard"
}

Быстрое исправление:

GET kibana_sample_data/_search
{
  "query": {
    "regexp": {
      "message.keyword": "{.*"
    }
  }
}

или

{
  "query": {
    "regexp": {
      "message.keyword": ".*\"M001: This is a message-code.\".*"
    }
  }
}

Долгосрочное исправление: найдите способ принять json, поскольку он должен быть загружен без необходимости go до крайности регулярного выражения строки, подобной json.

...