如何使用ElasticSearch进行“加入”/“子查询”?

时间:2013-11-26 23:18:55

标签: join elasticsearch subquery

我是ElasticSearch的新手,我希望能够对索引进行查询,然后使用结果的一部分进行另一次查询。

例如,我们有一个tags索引,我们可以查询匹配的标记。该索引包含标识与其相关联的内容(挂钩)的存储字段。每种类型的内容都有自己的索引。我需要能够查询标记匹配,并让它不仅返回标记结果,而且返回与其关联的内容(不同索引)的存储字段(在本例中为title)。 / p>

1 个答案:

答案 0 :(得分:5)

我遇到了类似的问题。你需要在这里加入。 Elasticsearch团队建议使用应用程序端。 ES通过在我们的应用程序中实现连接来模拟关系数据库:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/application-joins.html 因此,您可以使用任何ES客户端并编写类似的东西

    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返回其他get查询的结果。

P.S。我在这里使用ES java客户端。它有点沉重。如果您需要Java客户端,最好使用jest客户端 - 对于简单的情况,可以使用更轻的版本。