为什么Elasticsearch过滤器会显示所有记录?

时间:2017-10-31 19:55:24

标签: elasticsearch

我正在使用Elasticsearch 5.5并尝试对某些指标数据运行过滤查询。例如:

 {
    "_index": "zabbix_test-us-east-2-node2-2017.10.29",
    "_type": "jmx",
    "_id": "AV9lcbNtvbkfeNFaDYH2",
    "_score": 0.00015684571,
    "_source": {
      "metric_value_number": 95721248,
      "path": "/home/ubuntu/etc_logstash/jmx/zabbix_test",
      "@timestamp": "2017-10-29T00:04:31.014Z",
      "@version": "1",
      "host": "18.221.245.150",
      "index": "zabbix_test-us-east-2-node2",
      "metric_path": "zabbix_test-us-east-2-node2.Memory.NonHeapMemoryUsage.used",
      "type": "jmx"
    }
  },
  {
    "_index": "zabbix_test-us-east-2-node2-2017.10.29",
    "_type": "jmx",
    "_id": "AV9lcbNtvbkfeNFaDYIU",
    "_score": 0.00015684571,
    "_source": {
      "metric_value_number": 0,
      "path": "/home/ubuntu/etc_logstash/jmx/zabbix_test",
      "@timestamp": "2017-10-29T00:04:31.030Z",
      "@version": "1",
      "host": "18.221.245.150",
      "index": "zabbix_test-us-east-2-node2",
      "metric_path": "zabbix_test-us-east-2-node2.ClientRequest.ReadLatency.Count",
      "type": "jmx"
    }
  }

我正在运行以下查询:

GET /zabbix_test-us-east-2-node2-2017.10.29/jmx/_search
{
  "query": {
    "bool": {
      "must": {
        "match": {
          "metric_path" : "zabbix_test-us-east-2-node2.ClientRequest.ReadLatency.Count"
        }
      }
    }
  }
}

即便如此,如果它显示所有记录。但是,如果我使用以下文本,它将通过显示完全匹配来工作:

  GET /zabbix_test-us-east-2-node2-2017.10.29/jmx/_search
    {
      "query": {
        "bool": {
          "must": {
            "match": {
              "metric_path" : "zabbix_test-us-east-2-node2.Memory.NonHeapMemoryUsage.used"
            }
          }
        }
      }
    }

有谁能告诉我我在这里做错了什么?

感谢。

1 个答案:

答案 0 :(得分:0)

您没有提及有关映射的任何内容,因此我认为您正在使用动态映射 - 您只是在弹性搜索中将这两个文档编入索引。

访问后

  

{yourhost} /zabbix_test-us-east-2-node2-2017.10.29/_mapping

您会看到 metric_path 字段可能包含 text 类型,这是字符串的默认值。正如documentation所述:

  

索引全文值的字段,例如电子邮件正文或产品说明。分析这些字段,即它们通过分析器传递,以便在被索引之前将字符串转换为单个术语列表

所以你的字段由分析器处理,最后你不会对这样的事情执行匹配: zabbix_test-us-east-2-node2.ClientRequest.ReadLatency.Count 而是反对一些分析形式,可能按时期划分,以及其他一些特殊字符。

因此,如果您要像发布的那样执行过滤,则应在索引任何文档之前静态定义索引。您不必为每个属性执行此操作,但至少 metric_path 应定义为关键字。所以你可以从:

开始
PUT {yourhost}/zabbix_test-us-east-2-node2-2017.10.29

 {
    "mappings": {
       "jmx": {
          "properties": {
             "metric_path": {
                "type": "keyword"
             }
          }
       }
    }
 }

然后你应该索引你的文件。其他字段的映射将由ES动态建立,但您附加的两个查询都将返回一个结果 - 正如您所期望的那样。