Elasticsearch 查询在 logstsah 中失败:需要冒号来分隔字段名称和值



我一直在尝试使用 logstash 来查询 elasticsearch 事件,以便我可以用更多人类可读的数据填充一些字段。我有一个人名索引,当我为其他类型的事件编制索引时,我尝试使用它来增强其他字段。

我想知道我的查询字符串有问题,但我不知道是什么。我只是不断收到此警告和person_query_failed标签:

[

2019-10-03T10:38:52,759][警告][logstash.filters.elasticsearch] 无法查询弹性搜索上一个事件 {:index=>"logstash-people", :error=>"意外字符 ('}'(代码 125((:需要冒号分隔字段名称和值 在 [源: (byte[](

\"{ \"query\": { \"query_string\": { \"query\": { \"id:109\" } } }, \"_source\": { \"cn\" }}\"; 行: 3, 列: 42]"} [2019-10-03T10:38:52,760][警告][logstash.filters.elasticsearch] 无法查询弹性搜索上一个事件 {:index=>"logstash-people", :error=>"意外字符 ('}' (代码 125((: 期望冒号分隔字段名称和值 在 [源: (byte[](

\"{ \"query\": { \"query_string\": { \"query\": { \"id:4\" } } }, \"_source\": { \"cn\" }}\"; 行: 3, 列: 40]"} [2019-10-03T10:38:52,764][警告][logstash.filters.elasticsearch] 无法查询弹性搜索以前的事件 {:index=>"logstash-people", :error=>"意外字符 ('}' (代码 125((: 需要冒号分隔字段名称和值 在 [源: (byte[](

\"{ \"query\": { \"query_string\": { \"query\": { \"id:49\" } } }, \"_source\": { \"cn\" }}\"; 行: 3, 列: 41]"}

这是我的查询模板person_query.json

{ 
"query": { 
"query_string": { "query": { "id:%{[dn_people]}" } }
},
"_source": { "cn" } 
}

这是我的日志存储过滤器配置:

filter {
elasticsearch {
hosts => [ "https://localhost:9200" ]
index => "logstash-people"
query_template => "/path/to/person_query.json"
fields => { "cn" => "person" }
user => admin
password => password
ca_file => "/etc/elasticsearch/root-ca.pem"
tag_on_failure => person_query_failed
}
}

在查看警告日志时,至少查询字符串本身似乎可以正常工作:">id:%{[dn_people]}">分别转换为"id:109"、">id:4">"id:125\"。

在编写查询时,我一直在看这个:https://discuss.elastic.co/t/how-to-query-elasticsearch-and-take-some-fields-from-old-data/75300/3

有人可以帮助并推动我朝着正确的方向解决这个问题吗?

我正在使用Opendistro进行Elasticsearch。

在我看来,问题就在这里

意外字符("}"(代码 125((:需要冒号分隔字段名称和值 在 [源: (byte[](

\"{ \"query\": { \"query_string\": { \"query\": { \"id:49\" } } }, \"_source\": { \"cn\" }}\"; 行: 3,列: 41]"}

查询模板应如下所示:

{
"query": { 
"query_string": { "query": { "id": %{[dn_people]} } }
},
"_source": { "cn" } 
}

不同之处在于,您需要通过引用整个字段名称后跟冒号,然后引用值来分隔字段和值。

您可以通过查看已解决的查询来识别问题:

\

"ID:109\">

如果没有转义字符,它看起来像这样:

"编号:109">

Elasticsearch 将整个字符串解释为字段名称,找不到以下冒号和值。

必须解决以下问题:

\"id":

109 或未转义:"id":109

多亏了apt-get_install_skill 的回答,我能够继续解决我的问题。有几个,我可以通过一些沉重的谷歌搜索轻松解决。

最后,使用此查询模板时

{ 
"query": {
"query_string": { "query": { "id": %{[dn_people]} } } 
},
"_source": [ "cn" ] 
}

出现以下警告:

[

2019-10-03T12:50:20,563][警告][logstash.filters.elasticsearch] 无法查询弹性搜索以前的事件 {:index=>"logstash-people", :error=>"[400] {\"error\":{\"root_cause\":[{\"type\":\"parsing_exception",\"reason\":\"[query_string] 未知令牌 [START_OBJECT] 在 [query]\",\"line\":1,\"col\":35}],\"type\":\"parsing_exception\",\"reason":\"[query_string] 未知令牌 [START_OBJECT] 之后 [query]\",\"line\":1,\"col\":35},\"status\":400}"}

我发现弹性搜索查询的这个线程未知令牌错误没有直接回答我的情况,但幸运的是 baudsp 已经给出了正确的答案作为评论。

因此,根据 baudsp 的评论,这是正确的查询模板

{ 
"query": {
"query_string": { "query": "id:%{[dn_people]}" }
},
"_source": [ "cn" ]
}

最新更新