【问题标题】:Match Substring email address at specific location in ELK匹配 ELK 中特定位置的子字符串电子邮件地址
【发布时间】:2020-10-27 18:38:45
【问题描述】:

我正在尝试从 ELK Kibanadiscover 部分的消息字段中查找与电子邮件匹配的数据,我正在使用以下方法获得结果:

@message:"abc@email.com"

但是,生成的结果包含一些不应匹配电子邮件的其他消息,我无法为此构建解决方案。

结果是(出于安全原因,数据已被清理):

@message:[INF] [2020-07-07 12:54:51.105] [PID-1] : [abcdefg] [JID-5c] [数据] LIST_LOOKUP:abc@email.com |个人资料中的用户列表 |姓名 | 用户名@id:355502086986714

@message:[INF] [2020-07-07 12:38:36.755] [PID-2] : [abcdefg] [JID-ed2] [数据] LIST_LOOKUP:abc@email.com |个人资料中的用户列表 |姓名 | 用户名@id:355501869671304

@message:[INF] [2020-07-07 12:19:48.141] [PID-3] [abc@email.com]: [c5] [data] 在 11 毫秒内完成 200 OK @id:355501617979964834

@message:[INF] [2020-07-07 11:19:48.930] [PID-5] [abc@email.com]: [542] [数据] 在 9 毫秒内完成 200 OK @id:35550081535

虽然我希望它是:

@message:[INF] [2020-07-07 12:19:48.141] [PID-3] [abc@email.com]: [c5] [data] 在 11 毫秒内完成 200 OK @id:355501617979964834

@message:[INF] [2020-07-07 11:19:48.930] [PID-5] [abc@email.com]: [542] [数据] 在 9 毫秒内完成 200 OK @id:35550081535

我尝试过使用@message: "[PID-*] [abc@email.com]"@message: "\[PID-*\] \[abc@email.com\] \:"@message: "[abc@email.com]"@message: *abc@email.com* 和一些类似的搜索,但没有成功。

请让我知道我在这里缺少什么以及如何使用 discover 和 KQL/Lucene 在 ELK kibana 中进行有效的潜文本搜索。

这是我的索引的映射(我正在从 cloudwatch 日志中获取数据):

{
   "cwl-*":{
      "mappings":{
         "properties":{
            "@id":{
               "type":"string"
            },
            "@log_stream":{
               "type":"string"
            },
            "@log_group":{
               "type":"string"
            },
            "@message":{
               "type":"string"
            },
            "@owner":{
               "type":"string"
            },
            "@timestamp":{
               "type":"date"
            }
         }
      }
   }
}

【问题讨论】:

    标签: elasticsearch lucene kibana amazon-elasticsearch


    【解决方案1】:

    正如@Gibbs 已经提到原因all your data contains 字符串abc@email.com 并且现在通过查看您的映射确认您正在使用string 字段而没有显式分析器将使用default standard analyzer

    您应该将获取邮件 ID 的字段映射到使用不拆分文本的 UAX URL Email tokenizer 的自定义分析器。

    如何通过示例创建此分析器的示例

    使用自定义电子邮件分析器进行映射

    {
        "settings": {
            "analysis": {
                "analyzer": {
                    "email_analyzer": {
                        "tokenizer": "my_tokenizer"
                    }
                },
                "tokenizer": {
                    "my_tokenizer": {
                        "type": "uax_url_email"
                    }
                }
            }
        },
        "mappings": {
            "properties": {
                "email": {
                    "type": "text",
                    "analyzer": "email_analyzer"
                }
            }
        }
    }
    

    分析 api 响应

    POST http://{{hostname}}:{{port}}/{{index-name}}/_analyze

    {
        "analyzer": "email_analyzer",
        "text": "abc@email.com"
    }
    
    
    {
        "tokens": [
            {
                "token": "abc@email.com",
                "start_offset": 0,
                "end_offset": 13,
                "type": "<EMAIL>",
                "position": 0
            }
        ]
    }
    

    【讨论】:

    • 谢谢你的详细回复,我是通过cloudwatch日志获取数据,可能无法更改映射,因为我将多个日志组的数据输入到elk中,是否可以在没有的情况下生成查询更改我的映射。
    • @ShubhamNamdeo 如果您能投票并接受答案,那就太好了:) 提前致谢
    • 是的,这只是我对这两个答案的赞成票。
    【解决方案2】:

    您的所有结果都包含abc@gmail.com。所以是意料之中的。

    [abc@gmail.com] 被标记为

    {
        "tokens": [
            {
                "token": "abc",
                "start_offset": 1,
                "end_offset": 4,
                "type": "<ALPHANUM>",
                "position": 0
            },
            {
                "token": "gmail.com",
                "start_offset": 5,
                "end_offset": 14,
                "type": "<ALPHANUM>",
                "position": 1
            }
        ]
    }
    

    如果您有电子邮件字段,则可以使用它。或者您需要更改该字段的映射。

    如果它没有回答您的问题,您能否使用 http://host:port/indexName/_mapping 为该字段添加映射

    【讨论】:

    • 是否可以创建任何子字符串查询来获得所需的结果?
    • 我需要查看您的映射以进行检查。这就是为什么我要求您也添加映射。问题是您的数据可能不会作为单个字符串存储在索引中。
    • 我已经添加了映射,仅供参考,我通过 aws 提供的 lambda 函数从 cloudwatch 日志中获取所有数据。
    猜你喜欢
    • 2012-07-04
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 2019-01-22
    • 2018-02-03
    • 2012-09-07
    • 2019-12-26
    • 1970-01-01
    相关资源
    最近更新 更多