ES小总结

组合查询

java 复制代码
FunctionScoreQueryBuilder functionScoreQuery = 
    QueryBuilders.functionScoreQuery(
        boolQuery,
        new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
                new FunctionScoreQueryBuilder.FilterFunctionBuilder(
                        QueryBuilders.termQuery("isAD",true),
                        ScoreFunctionBuilders.weightFactorFunction(200)
                )
        });

总代码:

java 复制代码
public PageResult search(RequestParams params) {
        try {
            SearchRequest request = new SearchRequest("hotel");
            //准备DSL
            String key = params.getKey();
            //query
            //构建BooleanQuery
            BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
            //关键字搜索--> must
            if (key == null || "".equals(key)) {
                boolQuery.must(QueryBuilders.matchAllQuery());
            } else {
                boolQuery.must(QueryBuilders.matchQuery("all", key));
            }
            //城市条件
            if (params.getCity() != null && !params.getCity().equals("")) {
                boolQuery.filter(QueryBuilders.termQuery("city", params.getCity()));
            }
            //品牌条件
            if (params.getBrand() != null && !params.getBrand().equals("")) {

            }
            //星级条件
            if (params.getStarName() != null && !params.getStarName().equals("")) {

            }
            //价格
            if (params.getMinPrice() != null && params.getMaxPrice() != null) {
                //range过滤
                boolQuery.filter(QueryBuilders.rangeQuery("price").lte(params.getMaxPrice()).gte(params.getMinPrice()));
            }
            //分页
            int page = params.getPage();
            int size = params.getSize();
            request.source().from((page - 1) * size).size(size);
            //排序
            String location = params.getLocation();
            if (location != null && !location.equals("")) {
                request.source().sort(SortBuilders.geoDistanceSort("location", new GeoPoint(location))
                        .unit(DistanceUnit.KILOMETERS)
                        .order(SortOrder.ASC)
                );
            }

            //算分控制
            FunctionScoreQueryBuilder functionScoreQuery = QueryBuilders.functionScoreQuery(
                    boolQuery,
                    new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
                            new FunctionScoreQueryBuilder.FilterFunctionBuilder(
                                    QueryBuilders.termQuery("isAD",true),
                                    ScoreFunctionBuilders.weightFactorFunction(200)
                            )
                    });
            request.source().query(functionScoreQuery);

            //发送请求
            SearchResponse response = client.search(request, RequestOptions.DEFAULT);
            return handleResponse(response);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    private PageResult handleResponse(SearchResponse response) {
        //解析响应
        SearchHits searchHits = response.getHits();
        //获取总条数
        Long total = searchHits.getTotalHits().value;
        //获取文档数组
        SearchHit[] hits = searchHits.getHits();
        //遍历数组,取出数据
        List<HotelDoc> hotels = new ArrayList<>();
        for (SearchHit hit : hits) {
            //获取文档的source
            String json = hit.getSourceAsString();
            //反序列化
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            //获取sort值
            Object[] sortValues = hit.getSortValues();
            if (sortValues.length > 0) {
                Object sortValue = sortValues[0];
                hotelDoc.setDistance(sortValue);
            }
            hotels.add(hotelDoc);
        }
        //构造返回对象
        PageResult result = new PageResult(hotels, total);
        return result;
    }

步骤总结:

  1. 准备request
  2. 准备DSL
  3. 利用client来发送请求
  4. 解析client的返回值

准备request

request分为创建、查询、删除、更新等操作。

Document文档的操作

创建

java 复制代码
    void testAddDocument() throws IOException {
        Hotel hotel = hotelService.getById(61083L);
        HotelDoc hotelDoc=new HotelDoc(hotel);

        //创建request对象
        IndexRequest request=new IndexRequest("hotel").id(hotelDoc.getId().toString());
        //准备JSON文档
        request.source(JSON.toJSONString(hotelDoc),XContentType.JSON);
        //发送请求
        client.index(request,RequestOptions.DEFAULT);
    }

查询

java 复制代码
    void testGetDocumentById() throws IOException {
        GetRequest request=new GetRequest("hotel","61083");
        //获取响应
        GetResponse response=client.get(request,RequestOptions.DEFAULT);

        String json = response.getSourceAsString();
        HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
        System.out.println(hotelDoc);
    }

删除

java 复制代码
    void DeleteDocument() throws IOException {
        DeleteRequest request=new DeleteRequest("hotel","61083");
        client.delete(request,RequestOptions.DEFAULT);
    }

更新

java 复制代码
    void testUpdateDocument() throws IOException {
        UpdateRequest request=new UpdateRequest("hotel","61083");
        //准备发送请求
        request.doc(
                "price","123"
        );
        client.update(request,RequestOptions.DEFAULT);
    }

Index索引的操作

创建

java 复制代码
    void createHotelIndex() throws IOException {
        //创建Request对象
        CreateIndexRequest request = new CreateIndexRequest("hotel");
        //准备请求参数,DSL语句
        request.source(MAPPING_TEMPLATE, XContentType.JSON);
        //发送请求
        client.indices().create(request, RequestOptions.DEFAULT);
    }

删除

java 复制代码
    void DeleteHotelIndex() throws IOException {

        //创建对象
        DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("hotel");
        //发送请求
        client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
    }

Bool复合查询

java 复制代码
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();//创建boolQuery

//根据must、should、filter等来填写查询条件

boolQuery.must(QueryBuilders.matchQuery("all", key));

boolQuery.filter(QueryBuilders.termQuboolQuery.filter(QueryBuilders.rangeQuery("price").lte(params.getMaxPrice()).gte(params.getMinPrice()));ery("city", params.getCity()));
相关推荐
wudl55662 小时前
flink 1.20 物化表(Materialized Tables)
大数据·flink·linq
InfiSight智睿视界3 小时前
AI 技术助力汽车美容行业实现精细化运营管理
大数据·人工智能
熙客4 小时前
搜索引擎数据库介绍
搜索引擎
8K超高清5 小时前
高校巡展:中国传媒大学+河北传媒学院
大数据·运维·网络·人工智能·传媒
amhjdx5 小时前
政策东风下:卓玛儿童级健康腻子引领行业升级
大数据
TDengine (老段)5 小时前
TDengine 字符串函数 CONCAT_WS 用户手册
android·大数据·数据库·时序数据库·tdengine·涛思数据
TTGGGFF5 小时前
人工智能:大语言模型或为死胡同?拆解AI发展的底层逻辑、争议与未来方向
大数据·人工智能·语言模型
杂家7 小时前
Hadoop完全分布式部署(超详细)
大数据·hadoop·分布式
BD_Marathon7 小时前
【Hadoop】hadoop3.3.1完全分布式配置
大数据·hadoop·分布式
Ashlee_code8 小时前
BSS供应商:电信与金融领域的幕后支撑者
大数据·网络·金融·系统架构·跨境·金融机构·场外期权