[英]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.