RestHighLevelClient整合es实现不同的type关联查询
时间: 2023-11-08 16:59:19 浏览: 84
在Elasticsearch 7.0及以上版本中,已经移除了type的概念,所有文档都属于同一个_type。因此,在使用RestHighLevelClient进行关联查询时,不需要考虑type的问题。
可以使用多个index进行联合查询,例如:
```
SearchRequest searchRequest = new SearchRequest("index1", "index2");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery("field1", "value1"));
searchSourceBuilder.query(QueryBuilders.matchQuery("field2", "value2"));
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
```
在上面的例子中,使用了两个index进行联合查询,查询条件分别为field1=value1和field2=value2。可以根据实际需求添加更多的查询条件。
相关问题
springboot整合es实现不同的type关联查询
在Elasticsearch 7.x版本中,已经不再支持使用不同type进行关联查询。因此,如果需要实现不同type的关联查询,可以考虑以下两种方式:
1. 使用相同的type进行关联查询
在同一个index中可以定义多个type,将不同的数据类型存储在不同的type中。可以通过在查询时指定不同的type进行关联查询,例如:
```
GET /my_index/_search
{
"query": {
"bool": {
"must": [
{ "match": { "type1.field": "value" } },
{ "match": { "type2.field": "value" } }
]
}
}
}
```
2. 使用parent-child关联查询
在Elasticsearch中,可以使用parent-child关联查询实现不同type的关联查询。这种方式需要在创建index时指定parent和child的关系,例如:
```
PUT /my_index
{
"mappings": {
"parent": {
"properties": {
"name": { "type": "text" }
}
},
"child": {
"_parent": { "type": "parent" },
"properties": {
"age": { "type": "integer" }
}
}
}
}
```
在查询时,可以使用has_child或has_parent查询来实现关联查询,例如:
```
GET /my_index/_search
{
"query": {
"has_child": {
"type": "child",
"query": {
"match": { "age": 10 }
}
}
}
}
```
以上就是实现不同type关联查询的两种方式,可以根据具体需求选择合适的方式。
elasticsearchtemplate 工具类实现不同的type关联查询
ElasticsearchTemplate 是 Spring Data Elasticsearch 提供的 Elasticsearch 操作模板类,可以方便地进行 Elasticsearch 的操作。关于 ElasticsearchTemplate 的使用,可以参考官方文档。
关于不同 type 关联查询的实现,需要先了解 Elasticsearch 中的 mapping 和 routing。
mapping:定义了索引中的字段类型、分词方式、存储方式等信息。在创建索引时可以指定 mapping,也可以自动创建。
routing:用于将文档路由到对应的 shard 上。在创建索引时可以指定 routing,也可以自动路由。
在 Elasticsearch 中,一个索引可以有多个 type,每个 type 可以有不同的 mapping 和 routing。因此,不同 type 之间可以进行关联查询。
下面是一个简单的示例,假设索引名为 my_index,有两个 type:user 和 role。
User:
```
{
"user_id": 1,
"username": "john",
"role_id": 1
}
```
Role:
```
{
"role_id": 1,
"name": "admin"
}
```
我们想要查询 username 为 john 的用户所属的角色信息,可以使用 ElasticsearchTemplate 的 queryForList 方法进行查询:
```
QueryBuilder userQuery = QueryBuilders.termQuery("username", "john");
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(userQuery)
.withTypes("user")
.build();
List<User> users = elasticsearchTemplate.queryForList(searchQuery, User.class);
if (!users.isEmpty()) {
User user = users.get(0);
QueryBuilder roleQuery = QueryBuilders.termQuery("role_id", user.getRoleId());
searchQuery = new NativeSearchQueryBuilder()
.withQuery(roleQuery)
.withTypes("role")
.build();
List<Role> roles = elasticsearchTemplate.queryForList(searchQuery, Role.class);
}
```
在这个例子中,我们先通过 username 查询到了对应的 user,然后再根据 user 的 role_id 查询对应的 role。需要注意的是,查询时需要指定 type,以便 Elasticsearch 能够正确路由查询请求。
阅读全文