[英]How do I not match a bare hyphen in Elasticsearch?
我正在查詢存儲在Elasticsearch中的Apache日志。 我想從給定的主機名返回日志條目,該主機名帶有連字符並具有填充的auth字段。
這些字符串應完全匹配: "hostname": "example-dev"
而不是"auth": "-"
。
我的問題是:
連字符是Elasticsearch中的保留字符,因此我知道需要特別的努力。 但是,在弄清楚如何在查詢中包括它似乎遇到了很多麻煩。
我試圖將類型重新映射為not_analysed
。 格式似乎最近已更改。 定義索引的舊方法( "analysed"
, "not_analysed"
和"no"
)對我來說很有意義。 新方法( true
或false
)沒有。 無論哪種情況,我似乎都無法重新映射到工作上。
這是我重新映射的嘗試:
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.