我的查询在几十条记录中按预期执行。我们已经开始向我们的ES实例提供更多数据,现在我没有得到任何结果:
首先查询:
{
"query": {
"bool": {
"must": [
{
"match": {
"message": "new connection attempt failed: null"
}
}
]
}
}
}
我收到了一些记录。这表明记录实际上是我期望的索引。
如果我从结果中选择一条记录:
{ "_index": "logstash-2018.04.12", "_type": "log", "_id": "AWK3J1xarbUl8ovcY8uv", "_score": 6.621839, "_source": { "cluster": "dev-east-1-c5", "offset": 35858135, "level": "ERROR", ... }然后添加一个术语过滤器以仅获取特定群集的条目,我什么也得不回(但只有当索引加载了超过几千条记录时)。
{
"query": {
"bool": {
"must": [
{
"match": {
"message": "new connection attempt failed: null"
}
}
],
"filter": [
{
"term": {
"cluster": "dev-east-1-c5"
}
}
]
}
}
}
用简单的英语描述我想要做的事情:
message - 匹配包含消息字符串的任何条目
然后过滤那些只返回clustername完全匹配的条目。
编辑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
}
}
}
}
}
}
}
}
答案 0 :(得分:0)
有两个问题:
我的评论中提到了第一个问题。通过对普通"集群"进行术语过滤。而不是" cluster.keyword"一个分析仪正在调整一些东西,我没有得到完全匹配的命中。 (这似乎是2.x后的方法)
第二个问题是关于bool匹配的消息。匹配没有位置的概念,并且为大型数据集提供了各种意想不到的结果。修复是将bool匹配更改为bool match_phrase,然后根据更新过滤器。
似乎正在按我想要的方式工作。我有点担心可能有更高效的方法来做到这一点。我看到有些人正在使用通配符,我相信这是一个小小的进步。不确定是否有一种我不知道的古茹方法。