在Spring Boot环境下,可以使用Elasticsearch进行门店和商品数据的存储和查询。你可以按照以下步骤实现显示满足同城配送的门店的商品的分页查询:

  1. 定义门店和商品的数据模型,包括门店的配送方式和多边形电子围栏的坐标信息。
public class Store {
    private String id;
    private String name;
    private List<String> deliveryMethods;
    private List<Coordinate> fenceCoordinates;
    // getter and setter
}

public class Product {
    private String id;
    private String name;
    private double price;
    private String storeId;
    // getter and setter
}

public class Coordinate {
    private double lat;
    private double lon;
    // getter and setter
}
  1. 创建Elasticsearch的索引和映射,并将门店和商品数据存储到索引中。
// 创建门店索引
CreateIndexRequest createIndexRequest = new CreateIndexRequest("stores");
createIndexRequest.mapping("store", "{\n" +
        "  \"properties\": {\n" +
        "    \"name\": {\n" +
        "      \"type\": \"text\"\n" +
        "    },\n" +
        "    \"deliveryMethods\": {\n" +
        "      \"type\": \"keyword\"\n" +
        "    },\n" +
        "    \"fenceCoordinates\": {\n" +
        "      \"type\": \"geo_shape\"\n" +
        "    }\n" +
        "  }\n" +
        "}", XContentType.JSON);
CreateIndexResponse createIndexResponse = client.indices().create(createIndexRequest, RequestOptions.DEFAULT);

// 创建商品索引
createIndexRequest = new CreateIndexRequest("products");
createIndexRequest.mapping("product", "{\n" +
        "  \"properties\": {\n" +
        "    \"name\": {\n" +
        "      \"type\": \"text\"\n" +
        "    },\n" +
        "    \"price\": {\n" +
        "      \"type\": \"double\"\n" +
        "    },\n" +
        "    \"storeId\": {\n" +
        "      \"type\": \"keyword\"\n" +
        "    }\n" +
        "  }\n" +
        "}", XContentType.JSON);
createIndexResponse = client.indices().create(createIndexRequest, RequestOptions.DEFAULT);

// 存储门店数据
IndexRequest indexRequest = new IndexRequest("stores", "store", store.getId())
        .source(jsonBuilder()
                .startObject()
                .field("name", store.getName())
                .field("deliveryMethods", store.getDeliveryMethods())
                .field("fenceCoordinates", store.getFenceCoordinates())
                .endObject());
IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);

// 存储商品数据
indexRequest = new IndexRequest("products", "product", product.getId())
        .source(jsonBuilder()
                .startObject()
                .field("name", product.getName())
                .field("price", product.getPrice())
                .field("storeId", product.getStoreId())
                .endObject());
indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
  1. 编写查询方法,根据经纬度和配送方式查询满足条件的门店和商品列表。
public List<Product> searchProductsByLocation(double lat, double lon, String deliveryMethod, int page, int size) throws IOException {
    // 构建多边形查询条件
    GeoPolygonQueryBuilder geoPolygonQueryBuilder = QueryBuilders.geoPolygonQuery("fenceCoordinates",
            new GeoPoint(lat, lon), // 当前位置经纬度
            // 多边形电子围栏坐标点
            new GeoPoint(39.984702, 116.318417),
            new GeoPoint(39.984702, 116.404305),
            new GeoPoint(39.951673, 116.404305),
            new GeoPoint(39.951673, 116.318417),
            new GeoPoint(39.984702, 116.318417));

    // 构建配送方式查询条件
    TermQueryBuilder deliveryMethodQueryBuilder = QueryBuilders.termQuery("deliveryMethods", deliveryMethod);

    // 构建查询条件
    BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
            .filter(geoPolygonQueryBuilder)
            .filter(deliveryMethodQueryBuilder);

    // 构建分页查询请求
    SearchRequest searchRequest = new SearchRequest("products");
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder()
            .query(boolQueryBuilder)
            .from(page * size)
            .size(size);
    searchRequest.source(searchSourceBuilder);

    // 执行查询请求
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

    // 处理查询结果
    SearchHits hits = searchResponse.getHits();
    List<Product> products = new ArrayList<>();
    for (SearchHit hit : hits) {
        Map<String, Object> sourceAsMap = hit.getSourceAsMap();
        Product product = new Product();
        product.setId(hit.getId());
        product.setName((String) sourceAsMap.get("name"));
        product.setPrice((Double) sourceAsMap.get("price"));
        product.setStoreId((String) sourceAsMap.get("storeId"));
        products.add(product);
    }
    return products;
}
  1. 调用查询方法进行分页查询满足同城配送的门店的商品。
double lat = 39.98192; // 当前位置纬度
double lon = 116.30642; // 当前位置经度
String deliveryMethod = "同城"; // 配送方式
int page = 0; // 当前页码
int size = 10; // 每页显示数量

List<Product> products = searchProductsByLocation(lat, lon, deliveryMethod, page, size);

以上是一个基本的实现示例,你可以根据实际需求进行修改和扩展

在springboot环境下 门店和商品数据在es内门店有快递、同城、自提三种方式的一种到三种同城方式带有多边形电子围栏根据经纬度在多边形电子围栏内才能显示现在分页查询商品有显示满足同城配送的门店

原文地址: https://www.cveoy.top/t/topic/ibdU 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录