代码之家  ›  专栏  ›  技术社区  ›  valik

在Java弹性搜索中获取Min和max之间的价格范围数据

  •  1
  • valik  · 技术社区  · 7 年前

    我刚开始使用弹性搜索,目前我在阅读该文档,它很好,但我无法编写一个按范围获取的方法,下面是一个按ID获取的方法,它工作得很好,但我如何才能这样做,以获取与价格范围匹配的数据列表。

     public Map<String, Object> getTourById(String id){
            GetRequest getRequest = new GetRequest(INDEXTOUR, TYPETOUR, id);
            GetResponse getResponse = null;
            try {
                getResponse = restHighLevelClient.get(getRequest);
            } catch (java.io.IOException e){
                e.printStackTrace();
                e.getLocalizedMessage();
            }
            Map<String, Object> sourceAsMap = getResponse.getSourceAsMap();
            return sourceAsMap;
        }
    

    上面的方法现在很好,下面是按范围获取并返回与价格匹配的数据的方法

     public Map<String, Object> getTourByPriceRange(int minPrice, int maxPrice) {
    
            GetRequest getRequest = new GetRequest(INDEXTOUR, TYPETOUR, "requires an ID");
    
            QueryBuilder qb = QueryBuilders
                    .rangeQuery("price")
                    .from(minPrice)
                    .to(maxPrice)
                    .includeLower(true)
                    .includeUpper(true);
    
            GetResponse getResponse = null;
            try {
                getResponse = restHighLevelClient.get(getRequest);
            } catch (java.io.IOException e) {
                e.printStackTrace();
                e.getLocalizedMessage();
            }
            Map<String, Object> sourceAsMap = getResponse.getSourceAsMap();
    
            return sourceAsMap;
        }
    

    在上面的方法中,只有查询生成器才是准确的,我想要得到的结果是价格在给定范围内的一组数据。

    {
        "departure": {
          "city": "\u0438\u043d\u0441\u043a",
          "date": "2018-08-10"
        },
        "extras": [],
        "hotel": {
          "beach": {
            "distance": 0,
            "type": "\u041f\u0435\u0447\u0430\u043d\u044b\u0439"
          },
          "country": "\u0413\u0440\u0446\u0438\u044f",
          "distanceToAirport": 0,
          "facilities": [
            "Standard Without Balcony"
          ],
          "food": "\u0422\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0432\u0442\u0440\u0430\u043a\u0438",
          "photoUrl": "https://s1.tez-tour.com/hotel/7021893.jpg",
          "regionName": "\u0425\u0430\u043b\u043a\u0438\u0434\u0438\u043a\u0438 - \u041a\u0430\u0441\u0441\u0430\u043d\u0434\u0440\u0430",
          "stars": 4,
          "title": "KALLIKRATEIA"
        },
        "nights": 8,
        "people": 1,
        "price": 2595 // i want to use price as parameters for the search method
      }
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Val    7 年前

    到目前为止干得不错!!为了发出搜索请求,需要使用 SearchRequest 而不是 GetRequest 它是用来按ID检索单个文档的。

    QueryBuilder qb = QueryBuilders
                .rangeQuery("price")
                .from(minPrice)
                .to(maxPrice)
                .includeLower(true)
                .includeUpper(true);
    
        SearchRequest searchRequest = new SearchRequest(INDEXTOUR); 
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); 
        searchSourceBuilder.query(qb); 
        searchRequest.types(TYPETOUR);
        searchRequest.source(searchSourceBuilder); 
    
        SearchResponse searchResponse = null;
        try {
            searchResponse = restHighLevelClient.search(searchRequest);
        } catch (java.io.IOException e) {
            e.printStackTrace();
            e.getLocalizedMessage();
        }