我正在使用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"
}
}
}
}
}
有谁能告诉我我在这里做错了什么?
感谢。
答案 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动态建立,但您附加的两个查询都将返回一个结果 - 正如您所期望的那样。