我是elasticsearch的新手。我有两个文件是JarFileData和ClassData。我已将这两个文件与jarFileId字段相关联。
这是ClassData
{
"_id" : ObjectId("59881021e950041f0c6fa1fa"),
"ClassName" : "Exception",
"jarFileId" : "JAR-0001",
"dependencies" : [
{
"dependedntClass" : "java/lang/RuntimeException",
"methodSignature" : "<init>"
},
{
{
"dependedntClass" : "java/awt/EventQueue",
"methodSignature" : "isDispatchThread"
},
{
"dependedntClass" : "Exception",
"methodSignature" : "setStackTrace"
}
]
}
这是JarFileData
{
"_id" : ObjectId("59881021e950041f0c6fa1f7"),
"jarFileName" : "Client.jar",
"jarFileId" : "JAR-0001",
"directory" : "C:\\Projects\\Test\\Application",
"version" : null,
"artifactID" : null,
"groupID" : null
}
我想提供一个目录并获取该目录中的所有jarFiles,并使用它来查找那些jarFiles的ClassData类型的依赖类。
这是我在node.js中用于检索给定目录的jarFileData类型的函数。
const test = function test() {
let body = {
size: 20,
from: 0,
{
query: {
match: {
directory: 'C:\\Projects\\Test\\Application'
}
}
}
};
}
我正在尝试使用上面查询的结果集来查询classData类型。 我被困在这部分很长一段时间,不知道如何在弹性搜索中做到这一点。任何帮助将非常感激。
答案 0 :(得分:1)
在进一步发展之前,需要完成两个步骤:
jarFileId
和dependedntClass
字段应映射为keyword
类型(如果这是一个问题,您可以使用keyword
类型的multi-field field,并使用他们在查询中)dependencies
应为nested object 查看您的数据,这两种类型的文档之间的连接元素是jarFileId
字段。如果您的现有查询为您提供了结果,例如这个罐子清单:
{[{"jarFileId": "JAR-0001"},{"jarFileId": "JAR-0002"}]}
拥有此信息后,您可以使用此查询:
{
"size":0,
"query":{
"constant_score":{
"filter":{
"terms":{ "jarFileId":["JAR-0001","JAR-0002"] }
}
}
},
"aggs":{
"filtered":{
"filter":{
"constant_score":{
"filter":{
"terms":{ "jarFileId":["JAR-0001","JAR-0002"] }
}
}
},
"aggs":{
"dependent":{
"nested":{
"path":"dependencies"
},
"aggs":{
"classes":{
"terms":{
"field":"dependencies.dependedntClass"
}
}
}
}
}
}
}
}
结果你得到了:
{
...,
"aggregations": {
"filtered": {
"doc_count": 1,
"dependent": {
"doc_count": 3,
"classes": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "core/internal/TrackingEventQueue$TrackingException",
"doc_count": 1
},
{
"key": "java/awt/EventQueue",
"doc_count": 1
},
{
"key": "java/lang/RuntimeException",
"doc_count": 1
}
]
}
}
}
}
}
使用您当前的模型,无法使用一个查询执行此操作 - elsticsearch没有连接机制。单个文档应具有所有必要信息,以便elasticsearch能够确定它是否与查询匹配。这很好地描述了here。因此,如果搜索性能是此处的核心问题,您可以使用application-side joins(与链接下的类似示例)或denormalize your data。唯一的内置&#34;加入机制&#34;我所知道的是Term Filter Lookup,但它只允许在id
字段上操作。