簡體   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