2013-11-26 55 views
8

我是ElasticSearch的新手,我希望能夠對索引執行查詢,索引然後使用結果的一部分來執行另一個查詢。如何使用ElasticSearch做「加入」/「子查詢」?

例如,我們有一個tags索引,我們可以查詢匹配的標籤。該索引包含標識與其相關聯的內容的存儲字段(掛鉤到)。每種類型的內容都有自己的索引。我需要能夠查詢標籤匹配,並使其不僅返回標籤結果,而且還會從與其關聯的內容(不同索引)返回存儲的字段(本例中爲title)。

+0

我們可以使用ElasticSearch Hive連接器在Elastic on Elastic Database數據存儲上執行JOIN操作嗎? - https://github.com/elastic/elasticsearch-hadoop – sumanth232

+0

[Elastic Search和「sub queries」]的可能重複(http://stackoverflow.com/questions/8808832/elastic-search-and-sub-queries) – Ankur

回答

5

我面臨類似的問題。你需要在這裏加入。 Elasticsearch團隊建議使用應用程序。 ES模擬通過實現一個關係型數據庫在應用程序中加入:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/application-joins.html 所以你可以使用ES客戶端的任何寫類似的其他GET查詢的

SearchResponse response = client.prepareSearch(scriptVersionFirst) 
        .setTypes("yourtype") 
        .setQuery(QueryBuilders.termQuery("multi", "test")) 
        .setFrom(0).setSize(60).setExplain(true) 
        .execute() 
        .actionGet(); 

    if (response != null) { 
     SearchHits hitList = response.getHits(); 
     if (hitList != null) { 
      SearchHit[] hits = hitList.hits();   
      for (SearchHit hit : hits) 
       MethodPojo source = gson.fromJson(hit.getSourceAsString(), MethodPojo.class); 
       System.out.println("Found: " + getMethodResultEntity(scriptVersionSecond, hit.getType(), source.getMethodName(), source.getMethodDesc(), source.getRequest())); 
      } 
     }

以下功能getMethodResultEntity返回結果的東西。

P.S.我在這裏使用ES Java客戶端。這有點沉重。如果您需要Java客戶端,最好使用jest客戶端 - 簡單情況下的輕量級版本。

+0

我想知道是否有辦法要求彈性搜索返回連接。如果您查看http://www.elastic.co/guide/en/elasticsearch/guide/master/parent-child.html,則會聲明「子文檔可以作爲搜索請求的結果返回」。 –

+0

我們可以使用ElasticSearch Hive連接器在Elastic on Elastic Database數據存儲上執行JOIN操作嗎? - https://github.com/elastic/elasticsearch-hadoop – sumanth232