繁体   English   中英

如何在Elasticsearch中不匹配裸连字符?

[英]How do I not match a bare hyphen in Elasticsearch?

我正在查询存储在Elasticsearch中的Apache日志。 我想从给定的主机名返回日志条目,该主机名带有连字符并具有填充的auth字段。

这些字符串应完全匹配: "hostname": "example-dev"而不是"auth": "-"

我的问题是:

  1. 如何在Elasticsearch中正确地重新映射类型,以允许连字符成为匹配字符串的一部分。
  2. 如何在带有裸字符的Elasticsearch中正确查询类型。

连字符是Elasticsearch中的保留字符,因此我知道需要特别的努力。 但是,在弄清楚如何在查询中包括它似乎遇到了很多麻烦。

我试图将类型重新映射为not_analysed 格式似乎最近已更改。 定义索引的旧方法( "analysed""not_analysed""no" )对我来说很有意义。 新方法( truefalse )没有。 无论哪种情况,我似乎都无法重新映射到工作上。

这是我重新映射的尝试:

DELETE /search
PUT search
{
    "mappings" : {
        "beat" : {
            "properties" : {
                "hostname" : {
                    "type" : "text",
                    "norms" : false,
                    "index" : false
                }
            }
        }
    }
}

我没有包括auth字段的重新映射,因为它仅返回mapper_parsing_exception

我正在使用json查询Elasticsearch。 这是我的查询:

GET _search
{
    "query": {
        "bool": {
            "filter": {
                "bool": {
                    "must": [
                        {
                            "match": {
                                "beat.hostname": "example-dev"
                            }
                        }
                    ],
                    "must_not": [
                        {
                            "match": {
                                "auth.keyword": "-"
                            }
                        }
                    ]
                }
            }
        }
    }
}

我曾尝试使用\\\\-转义连字符,但返回的结果与"auth": "-"相匹配。 主机名仍然不完全匹配。 主机名查询还匹配“ example-prod”之类的内容。

我尝试使用“条件”而不是“匹配”; 没有返回结果。

我可以为“ auth”匹配一个特定的字符串,例如"must": { "match": { "auth": "foo" } }返回auth =“ foo”的所有条目。 那与我需要的相反,但是确实有效。 如果主机名包含连字符,则仍不完全匹配。

日志条目使用ELK堆栈解析到Elasticsearch中,但是由于传统原因,这将是在Kibana之外生成的报告。

我已经阅读了文档和示例,但是有很多需要深入研究的地方。 我发现的许多示例都是针对Elasticsearch的较旧版本的,虽然可以理解,但令人困惑。

我是Elasticsearch的新手。 感觉就像我只是在忽略某些东西,但是问题可能出在对Elasticsearch的工作方式有一个基本的误解。

在花了更多时间进行ElascticSearch查询之后,我想我已经解决了。

将主机名字符串拆分为两个单独的字符串,然后将两者匹配将按预期过滤主机名。 使用空字符串进行否定匹配似乎也可以正常工作。

这是更新的查询:

{
"query": {
    "bool": {
        "filter": {
            "bool": {
                "must": [
                    {
                        "match": {
                            "beat.hostname": "example"
                        }
                    },
                    {
                        "match": {
                            "beat.hostname": "dev"
                        }
                    }
                ],
                "must_not": [
                    {
                        "match_phrase": {
                            "auth.keyword": ""
                        }
                    }
                ]
            }
        }
    }
}

我将做更多测试,以确保这实际上返回了我需要的东西。

我尽力使ElasticSearch符合我的期望。 我没有与ElasticSearch合作,而是试图与之抗争。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM