【问题标题】:term filter on "bool must", not returning any results“bool must”上的术语过滤器,不返回任何结果
【发布时间】: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


【解决方案1】:

有两个问题:

我的评论中提到了第一个问题。通过对普通的“cluster”而不是“cluster.keyword”进行术语过滤,分析器正在调整事情,我没有得到精确匹配的命中。 (这似乎是 2.x 后的方法)

第二个问题是关于消息的布尔匹配。 match 没有位置的概念,并且对大型数据集给出了各种意想不到的结果。解决方法是将 bool 匹配更改为 bool match_phrase,然后根据它更新过滤器。

似乎现在可以按我的意愿工作了。我有点担心可能会有更高效的方法来做到这一点。我看到有些人在使用通配符,我相信这是一个轻微的改进。不确定是否有我不知道的大师方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 2022-09-19
    • 1970-01-01
    相关资源
    最近更新 更多