【问题标题】:How to do a "join"/"sub-query" using ElasticSearch?如何使用 ElasticSearch 进行“加入”/“子查询”?
【发布时间】:2013-12-12 08:40:42
【问题描述】:
我是 ElasticSearch 的新手,我希望能够对索引进行查询,然后使用部分结果进行另一个查询。
例如,我们有一个tags 索引,我们可以查询匹配的标签。该索引包含标识与其关联(挂钩)的内容的存储字段。每种类型的内容都有自己的索引。我需要能够查询标签匹配,并让它不仅返回标签结果,而且从与之关联的内容(不同的索引)中返回一个存储字段(在本例中为 title)。
【问题讨论】:
标签:
join
elasticsearch
subquery
【解决方案1】:
我遇到了类似的问题。你需要在这里加入。 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查询的结果。
附:我在这里使用 ES java 客户端。它有点重。如果您需要 java 客户端,最好使用 jest 客户端 - 用于简单情况的轻量级版本。