【发布时间】:2018-09-22 00:02:33
【问题描述】:
我有一个查询在几十条记录上按预期执行。我们已经开始向我们的 ES 实例提供更多数据,现在我没有得到任何结果:
第一个查询:
{
"query": {
"bool": {
"must": [
{
"match": {
"message": "new connection attempt failed: null"
}
}
]
}
}
}
我得到了一些记录。这表明记录实际上在我的索引中,正如我所期望的那样。
如果我从结果中选择一条记录:
{ "_index": "logstash-2018.04.12", "_type": "日志", "_id": "AWK3J1xarbUl8ovcY8uv", “_score”:6.621839, “_资源”: { “集群”:“dev-east-1-c5”, “偏移”:35858135, “级别”:“错误”, ... } 然后添加一个术语过滤器以仅获取特定集群的条目,我什么也得不到(但只有当索引加载了超过几千条记录时)。 {
"query": {
"bool": {
"must": [
{
"match": {
"message": "new connection attempt failed: null"
}
}
],
"filter": [
{
"term": {
"cluster": "dev-east-1-c5"
}
}
]
}
}
}
用简单的英语描述我正在尝试做的事情:
message -- 匹配任何包含消息字符串的条目
然后过滤它们以仅返回集群名称完全匹配的条目。
Edit 4/12/18 -- 根据要求添加日志类型的映射
{
"logstash-2018.04.12":{
"mappings":{
"log":{
"_all":{
"enabled":true,
"norms":false
},
"dynamic_templates":[
{
"message_field":{
"path_match":"message",
"match_mapping_type":"string",
"mapping":{
"norms":false,
"type":"text"
}
}
},
{
"string_fields":{
"match":"*",
"match_mapping_type":"string",
"mapping":{
"fields":{
"keyword":{
"ignore_above":256,
"type":"keyword"
}
},
"norms":false,
"type":"text"
}
}
}
],
"properties":{
"@timestamp":{
"type":"date",
"include_in_all":false
},
"@version":{
"type":"keyword",
"include_in_all":false
},
"application_name":{
"type":"text",
"norms":false,
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
},
"application_version":{
"type":"text",
"norms":false,
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
},
"beat":{
"properties":{
"hostname":{
"type":"text",
"norms":false,
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
},
"name":{
"type":"text",
"norms":false,
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
},
"version":{
"type":"text",
"norms":false,
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
}
}
},
"cluster":{
"type":"text",
"norms":false,
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
},
"geoip":{
"dynamic":"true",
"properties":{
"ip":{
"type":"ip"
},
"latitude":{
"type":"half_float"
},
"location":{
"type":"geo_point"
},
"longitude":{
"type":"half_float"
}
}
},
"host":{
"type":"text",
"norms":false,
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
},
"input_type":{
"type":"text",
"norms":false,
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
},
"level":{
"type":"text",
"norms":false,
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
},
"level_value":{
"type":"long"
},
"logger_name":{
"type":"text",
"norms":false,
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
},
"message":{
"type":"text",
"norms":false
},
"offset":{
"type":"long"
},
"source":{
"type":"text",
"norms":false,
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
},
"tags":{
"type":"text",
"norms":false,
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
},
"thread_name":{
"type":"text",
"norms":false,
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
},
"type":{
"type":"text",
"norms":false,
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
}
}
}
}
}
}
【问题讨论】:
-
您想要的是 post_filter,请参阅此处的文档elastic.co/guide/en/elasticsearch/reference/6.2/…
-
有趣...我将过滤器吊出来,并将其作为 post_filter 放在查询之后。仍然获得 0 次点击。这看起来在语法上正确吗?它运行良好:{“查询”:{“布尔”:{“必须”:[{“匹配”:{“消息”:“新连接尝试失败:null”}}]}},“post_filter”:{“术语“:{“集群”:“dev-east-1-c5”}}}
-
将匹配查询从bool子句中取出,没有必要
-
我不明白你们,他的查询是完全有效的。不需要
post_filter或将match从布尔查询中取出。首先应用filter来缩小应用匹配子句的文档集。 @JvmSd121 你能显示你的映射吗? -
我在主帖中添加了上面的映射。我发现一些文档显示了我可以在哪里强制该字段未分析以进行精确匹配。问题是我们不可能总是只对集群和主机字段进行完全匹配。
标签: elasticsearch