将嵌套查询与脚本过滤器混合
Mix nested query with scripted filter
上下文
我们在 elasticsearch 中有关于恶意软件的数据。我们必须用kibana来分析它。对于每个样本(恶意软件),我们都有一些 SSL 证书。这些是嵌套字段。我是 elasticsearch 的新手,很难在官方文档中找到我想要的内容。
我想要的
我希望能够根据这些规则创建图表(即折线图):
- Y 轴简单计数
- X 轴上的证书文件名
- 仅显示主题 == 发行人
简化映射
{
"mappings":{
"sample":{
"properties":{
"static":{
"x509Certificates":{
"type":"nested",
"properties":{
"Status":{
"type":"long"
},
"FileName":{
"type":"keyword"
},
"Serial":{
"type":"long"
},
"Signature":{
"type":"keyword"
},
"PublicKey":{
"type":"keyword"
},
"NotValidBefore":{
"type":"date",
"format":"epoch_millis"
},
"NotValidAfter":{
"type":"date",
"format":"epoch_millis"
},
"Subject":{
"type":"keyword"
},
"Issuer":{
"type":"keyword"
}
}
}
}
}
}
}
}
}
我已经尝试过的东西
不使用嵌套对象
它不起作用,因为没有 "join"。图表已创建,但信息一文不值。
使用 kibana 嵌套 fork
https://github.com/homeaway/kibana/tree/nestedSupport-5.2
它实际上是有帮助的。至少我们可以生成一个包含嵌套字段的图表。但是并没有完全解决问题。
在图表顶部的搜索栏中使用脚本查询
查询类似于:
{
"bool": {
"must": {
"script": {
"script": {
"inline": "doc['Subject'].value == doc['Issuer'].value",
"lang": "painless"
}
}
}
}
}
我一点也不确定,但这就像它在所有证书之间搜索至少两个值中的一个相等。
使用脚本字段
我创建了一个简单的布尔脚本字段,类似于:
doc['Subject'].value == doc['Issuer'].value
并为布尔值为真创建了一个查询。它部分工作。
嵌套查询
看起来确实像我想要的但是,我不知道如何用这种方法说 Issuer==Subject。
我的问题
知道这不是我们需要嵌套脚本过滤器的唯一用例,解决我的问题的最简单方法是什么?
不要犹豫,要求澄清!
如果您有这样的 脚本字段 怎么办,因为 Subject
和 Issuer
都是 keyword
的类型:
def newfield = "";
if((doc['Subject'].value).equals(doc['Issuer'].value)){
newfield= "matched";
}else{
newfield= "not matched";
}
然后也许您可以通过在图表中应用 过滤器 来使用上面的 脚本化字段 ,如:
scriptedFieldName:"matched"
希望对您有所帮助!
上下文
我们在 elasticsearch 中有关于恶意软件的数据。我们必须用kibana来分析它。对于每个样本(恶意软件),我们都有一些 SSL 证书。这些是嵌套字段。我是 elasticsearch 的新手,很难在官方文档中找到我想要的内容。
我想要的
我希望能够根据这些规则创建图表(即折线图):
- Y 轴简单计数
- X 轴上的证书文件名
- 仅显示主题 == 发行人
简化映射
{
"mappings":{
"sample":{
"properties":{
"static":{
"x509Certificates":{
"type":"nested",
"properties":{
"Status":{
"type":"long"
},
"FileName":{
"type":"keyword"
},
"Serial":{
"type":"long"
},
"Signature":{
"type":"keyword"
},
"PublicKey":{
"type":"keyword"
},
"NotValidBefore":{
"type":"date",
"format":"epoch_millis"
},
"NotValidAfter":{
"type":"date",
"format":"epoch_millis"
},
"Subject":{
"type":"keyword"
},
"Issuer":{
"type":"keyword"
}
}
}
}
}
}
}
}
}
我已经尝试过的东西
不使用嵌套对象
它不起作用,因为没有 "join"。图表已创建,但信息一文不值。
使用 kibana 嵌套 fork
https://github.com/homeaway/kibana/tree/nestedSupport-5.2 它实际上是有帮助的。至少我们可以生成一个包含嵌套字段的图表。但是并没有完全解决问题。
在图表顶部的搜索栏中使用脚本查询
查询类似于:
{
"bool": {
"must": {
"script": {
"script": {
"inline": "doc['Subject'].value == doc['Issuer'].value",
"lang": "painless"
}
}
}
}
}
我一点也不确定,但这就像它在所有证书之间搜索至少两个值中的一个相等。
使用脚本字段
我创建了一个简单的布尔脚本字段,类似于:
doc['Subject'].value == doc['Issuer'].value
并为布尔值为真创建了一个查询。它部分工作。
嵌套查询
看起来确实像我想要的但是,我不知道如何用这种方法说 Issuer==Subject。
我的问题
知道这不是我们需要嵌套脚本过滤器的唯一用例,解决我的问题的最简单方法是什么?
不要犹豫,要求澄清!
如果您有这样的 脚本字段 怎么办,因为 Subject
和 Issuer
都是 keyword
的类型:
def newfield = "";
if((doc['Subject'].value).equals(doc['Issuer'].value)){
newfield= "matched";
}else{
newfield= "not matched";
}
然后也许您可以通过在图表中应用 过滤器 来使用上面的 脚本化字段 ,如:
scriptedFieldName:"matched"
希望对您有所帮助!