在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的ClassDatatypes中的依赖类。

这是我在node.js中用于检索给定目录的jarFileDatatypes的函数。

 const test = function test() { let body = { size: 20, from: 0, { query: { match: { directory: 'C:\\Projects\\Test\\Application' } } } }; } 

我想从上面的查询结果集来查询classDatatypes。 我被困在这个部分很长一段时间,不知道如何在弹性search中做到这一点。 任何帮助将非常感激。

在你走得更远之前,有两个步骤需要完成:

  • jarFileIdjarFileId字段应该被映射为keywordtypes(如果这是一个问题,您可以使用keywordtypes的多字段字段 ,并在查询中使用它们)
  • dependencies应该是嵌套的对象

查看你的数据,这两种types的文件之间的连接元素是jarFileId字段。 如果你现有的查询给你的结果,例如这个jar子列表:

 {[{"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 } ] } } } } } 

用你现在的模型,不可能用一个查询来完成–selectsearch没有连接机制。 单个文档应该具有所有必要的信息,以便elasticsearch能够确定它是否与查询匹配。 这在这里很好地描述。 因此,如果search的性能是这里的核心问题,那么要么使用应用程序端连接 (类似于链接下的例子),要么将数据非规范化 。 我知道的唯一内置的“连接机制”是Term Filter Lookup,但它只允许在id字段上操作。