在springboot环境下 es创建两个索引分别为门店索引和商品索引租户id进行关联怎么把两个索引像mysql一样联表查询并且带商品名称查询分页查询门店距离排序
在Elasticsearch中,没有像关系型数据库中的联表查询的概念。但可以通过使用Elasticsearch的多索引查询和Nested数据类型来实现类似的功能。
首先,需要在索引中存储租户id和门店id之间的关联关系。可以使用Nested数据类型将门店信息存储为文档的一个字段。示例门店索引的映射如下:
{
"mappings": {
"properties": {
"tenantId": {
"type": "keyword"
},
"store": {
"type": "nested",
"properties": {
"storeId": {
"type": "keyword"
},
"storeName": {
"type": "text"
},
"distance": {
"type": "float"
}
}
}
}
}
}
示例商品索引的映射如下:
{
"mappings": {
"properties": {
"tenantId": {
"type": "keyword"
},
"productName": {
"type": "text"
}
}
}
}
接下来,可以使用Elasticsearch的多索引查询功能来联合查询两个索引。可以使用bool查询和nested查询来实现类似联表查询的功能。
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.NestedQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
// 创建RestHighLevelClient实例
public List<Map<String, Object>> searchWithJoinQuery(String tenantId, String productName, int page, int size) throws IOException {
// 创建搜索请求
SearchRequest searchRequest = new SearchRequest("store_index", "product_index");
// 创建查询条件
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
// 添加租户id条件
boolQuery.must(QueryBuilders.termQuery("tenantId", tenantId));
// 添加商品名称条件
boolQuery.must(QueryBuilders.matchQuery("productName", productName));
// 创建nested查询
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery("store", QueryBuilders.matchAllQuery(), org.apache.lucene.search.join.ScoreMode.None);
// 将nested查询添加到bool查询中
boolQuery.must(nestedQuery);
// 设置查询条件和分页
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(boolQuery);
sourceBuilder.from(page * size);
sourceBuilder.size(size);
// 发起搜索请求
searchRequest.source(sourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
// 处理搜索结果
List<Map<String, Object>> results = new ArrayList<>();
for (SearchHit hit : searchResponse.getHits().getHits()) {
results.add(hit.getSourceAsMap());
}
return results;
}
这样,就可以使用类似联表查询的方式在Spring Boot环境下查询两个索引,并且支持商品名称查询、分页查询以及门店距离排序。请注意,门店距离排序需要在查询结果中添加门店距离字段,并在查询时按照距离字段进行排序
原文地址: http://www.cveoy.top/t/topic/h72F 著作权归作者所有。请勿转载和采集!