2017-08-09 110 views
2

我是elasticsearch的新手。我有兩個文件是JarFileData和ClassData。我用jarFileId字段鏈接了這兩個文檔。在elasticsearch中查詢

這是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中,並用它來尋找在ClassData類型的依賴類那些jar文件。

這是我在node.js中用於檢索給定目錄的jarFileData類型的函數。

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

我想使用上述查詢的結果集來查詢classData類型。 我被困在這部分很長一段時間,不知道如何在彈性搜索中做到這一點。任何幫助將非常感激。

+0

你有什麼嘗試?也可能會注意到,這裏的mongodb查詢嘗試實際上是從「shell」運行的。您的彈性搜索查詢需要從您希望實施的實際語言環境運行。因此,它可以幫助您至少顯示您正在嘗試的內容,從而可以在您使用的實際環境中回答您的問題。哪個不會是mongodb shell。 –

+0

我想用node.js查詢彈性搜索。我嘗試過並且成功地進行了簡單的查詢,但是我無法完成我需要做的複雜查詢。 –

+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。我知道的唯一內置的「連接機制」是Term Filter Lookup,但它只允許在id字段中操作。

+0

非常感謝,事情是我想要一種方法來使用第二個查詢中第一個查詢的結果集。我已經設法分開做,因爲你已經完成了上述工作。但是我不能在第二個查詢中使用第一個查詢的結果集。再一次感謝你。 –

+0

@ M.Ramzan - 我更新了我的答案。 – Joanna

+0

這就是我所尋找的,我會嘗試更新我的模型並做到這一點。非常感謝。 –