ES代码

搜索

查询全部match_all:

查询全部数据,一般不会用这个。

    /**
     * 查询所有match all
     * @throws IOException
     */
    @Test
    public  void testMatchAll() throws IOException {
        //创建查询构造器queryBuilder来指定查询matchAllQuery
        QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();

        //创建搜索构造器searchSourceBuilder
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //指定搜索构造器的查询方式为查询构造器queryBuilder指定查询matchAllQuery
        searchSourceBuilder.query(queryBuilder);
        //指定搜索构造器的分页信息
        searchSourceBuilder.from(0);
        searchSourceBuilder.size(100);

        //创建搜索请求对象searchRequest指定搜索的索引名称goods
        SearchRequest searchRequest = new SearchRequest("goods");
        //搜索请求对象指定搜索构造器searchSourceBuilder为我们要使用的搜索工具
        searchRequest.source(searchSourceBuilder);

        //创建搜索返回对象拿到指定搜索请求的搜索结果
        SearchResponse searchResponse = client.search(searchRequest,RequestOptions.DEFAULT);

        //创建搜索命中数对象从搜索返回对象中拿到命中数
        SearchHits searchHits = searchResponse.getHits();

        //创建一个集合
        List<Goods> goodsList = new ArrayList<>();

        //以集合方式获取命中的数据
        for (SearchHit searchHit : searchHits) {
            //获取json字符串格式的数据
            String sourceAsString = searchHit.getSourceAsString();
            //字符串转为java对象
            Goods goods  = JSON.parseObject(sourceAsString,Goods.class);
            goodsList.add(goods);
        }

        //打印一下
        for (Goods goods : goodsList) {
            System.out.println(goods);
        }

        /*//看看命中了多少
        long value = searchHits.getTotalHits().value;
        System.out.println("总记录数:"+value);*/
    }

词条查询/精确查询term:

完全匹配,搜索“小米手机”那么结果必须是“小米手机”这四个字连着,如果搜索“小米iphoneXR”则什么结果都不会返回(除非数据库里有数据真的写的是“小米iphoeneXR”),一般用于选择品牌,高级选项等位置。

/**
     * 词条查询term
     * @throws IOException
     */
    @Test
    public  void testTerm() throws IOException {
        //创建查询构造器queryBuilder来指定查询termQuery
        //QueryBuilder queryBuilder = QueryBuilders.termQuery("title","华为");
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.filter(QueryBuilders.termQuery("title","华为"));
        //创建搜索构造器searchSourceBuilder
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //指定搜索构造器的查询方式为查询构造器queryBuilder指定查询termQuery
        //searchSourceBuilder.query(queryBuilder);
        searchSourceBuilder.query(boolQueryBuilder);
        //指定搜索构造器的分页信息
        searchSourceBuilder.from(0);
        searchSourceBuilder.size(100);

        //创建搜索请求对象searchRequest指定搜索的索引名称goods
        SearchRequest searchRequest = new SearchRequest("goods");
        //搜索请求对象指定搜索构造器searchSourceBuilder为我们要使用的搜索工具
        searchRequest.source(searchSourceBuilder);

        //创建搜索返回对象拿到指定搜索请求的搜索结果
        SearchResponse searchResponse = client.search(searchRequest,RequestOptions.DEFAULT);

        //创建搜索命中数对象从搜索返回对象中拿到命中数
        SearchHits searchHits = searchResponse.getHits();

        //创建一个集合
        List<Goods> goodsList = new ArrayList<>();

        //以集合方式获取命中的数据
        for (SearchHit searchHit : searchHits) {
            //获取json字符串格式的数据
            String sourceAsString = searchHit.getSourceAsString();
            //字符串转为java对象
            Goods goods  = JSON.parseObject(sourceAsString,Goods.class);
            goodsList.add(goods);
        }

        //打印一下
        for (Goods goods : goodsList) {
            System.out.println(goods);
        }
    }

分词查询match:

先分词,比如搜索“小米手机”,通过ik分词器分为“小米”和“手机”,“小米”和“手机”有两种逻辑,一种是and,一种是or
如果选择and逻辑:
搜索结果为“xxxx小米xxxxxxxx手机xxxx”,结果较少。
如果选择or逻辑:
搜索结果为“xxxx小米xxxxxxxx手机xxxx”,“xxxxxx小米xxxx”,“xxxxx手机xxxx”,结果较多。

    /**
     * 词条分词查询match
     * @throws IOException
     */
    @Test
    public  void testMatch() throws IOException {
        //创建查询构造器其父类MatchQueryBuilder来指定查询*Query
        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("title","华为手机");
        //and逻辑,or逻辑在后面改为OR即可
        matchQueryBuilder.operator(Operator.AND);

        //创建搜索构造器searchSourceBuilder
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //指定搜索构造器的查询方式为查询构造器queryBuilder指定查询*Query
        //searchSourceBuilder.query(queryBuilder);
        searchSourceBuilder.query(matchQueryBuilder);
        //指定搜索构造器的分页信息
        searchSourceBuilder.from(0);
        searchSourceBuilder.size(100);

        //创建搜索请求对象searchRequest指定搜索的索引名称goods
        SearchRequest searchRequest = new SearchRequest("goods");
        //搜索请求对象指定搜索构造器searchSourceBuilder为我们要使用的搜索工具
        searchRequest.source(searchSourceBuilder);

        //创建搜索返回对象拿到指定搜索请求的搜索结果
        SearchResponse searchResponse = client.search(searchRequest,RequestOptions.DEFAULT);

        //创建搜索命中数对象从搜索返回对象中拿到命中数
        SearchHits searchHits = searchResponse.getHits();

        //创建一个集合
        List<Goods> goodsList = new ArrayList<>();

        //以集合方式获取命中的数据
        for (SearchHit searchHit : searchHits) {
            //获取json字符串格式的数据
            String sourceAsString = searchHit.getSourceAsString();
            //字符串转为java对象
            Goods goods  = JSON.parseObject(sourceAsString,Goods.class);
            goodsList.add(goods);
        }

        //打印一下
        for (Goods goods : goodsList) {
            System.out.println(goods);
        }
    }
上一篇:es聚合结果返回所有字段


下一篇:显示所有Elasticsearch聚合结果/存储桶,而不仅仅是10个