将嵌套查询与脚本过滤器混合

Mix nested query with scripted filter

上下文

我们在 elasticsearch 中有关于恶意软件的数据。我们必须用kibana来分析它。对于每个样本(恶意软件),我们都有一些 SSL 证书。这些是嵌套字段。我是 elasticsearch 的新手,很难在官方文档中找到我想要的内容。

我想要的

我希望能够根据这些规则创建图表(即折线图):

简化映射

{
    "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。

我的问题

知道这不是我们需要嵌套脚本过滤器的唯一用例,解决我的问题的最简单方法是什么?

不要犹豫,要求澄清!

如果您有这样的 脚本字段 怎么办,因为 SubjectIssuer 都是 keyword 的类型:

def newfield = "";

if((doc['Subject'].value).equals(doc['Issuer'].value)){
   newfield= "matched";
}else{
   newfield= "not matched";
}

然后也许您可以通过在图表中应用 过滤器 来使用上面的 脚本化字段 ,如:

scriptedFieldName:"matched"

希望对您有所帮助!