查询弹性搜索

时间:2017-08-09 03:07:12

标签: javascript node.js elasticsearch

我是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类型。 我被困在这部分很长一段时间,不知道如何在弹性搜索中做到这一点。任何帮助将非常感激。

1 个答案:

答案 0 :(得分:1)

在进一步发展之前,需要完成两个步骤:

  • jarFileIddependedntClass字段应映射为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字段上操作。