#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"
}
}
}
}