java-api

本文最后更新于 2021-07-25 12:01:37

java api

maven

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.0.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

配置

@Configuration
public class ElasticsearchConfig extends AbstractElasticsearchConfiguration {
    @Override
    public RestHighLevelClient elasticsearchClient() {

        return RestClients.create(ClientConfiguration.create("172.18.95.136:9200")).rest();
    }

    // no special bean creation needed
}

实体类

@Document(indexName = "es_rest_goods_test", type = "_doc", shards = 1, replicas = 3, createIndex = true,
        useServerConfiguration = false, versionType = VersionType.EXTERNAL)
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Goods {
    //id注解必须有
    @Id
    private Long id;

    @Field(analyzer = "ik_max_word",type = FieldType.Text)
    private String name;

    @Field(type = FieldType.Keyword)
    private Double prise;

    @Field(analyzer = "ik_max_word",type = FieldType.Text)
    private String desc;

    @Field(type = FieldType.Integer)
    private Integer count;

    @Version
    private Long version;
}

mapper

父类有很多方法

通过方法名称

clipboard
clipboard
clipboard

  • 支持的返回类型
    clipboard

通过注解

clipboard

public interface GoodsMapper extends ElasticsearchRepository<Goods,String> {


}

查询demo

@SpringBootTest
class ElasticsearchDemoApplicationTests {

    @Autowired
    private ElasticsearchRestTemplate elasticsearchTemplate;

    @Autowired
    private GoodsMapper goodsMapper;

    //创建索引以及映射
    @Test
    void contextLoads() {
        elasticsearchTemplate.createIndex(Goods.class);
    }

    //插入数据 修改数据
    @Test
    void contextLoads2() {
        Goods goods = Goods.builder().id(1001L).name("macBook pro").desc("苹果电脑").prise(100.2).count(998).version(1L).build();
        Goods save = goodsMapper.save(goods);
        System.out.println(save);
    }

    //删除
    @Test
    void tset3() {
        //Goods goods = Goods.builder().id(1001L).build();
        //goodsMapper.delete(goods);
        goodsMapper.deleteById("1002");
    }

    //查询
    @Test
    void test4() {
        //所有
        // goodsMapper.findAll();
        //id查询
        // goodsMapper.findById("1003");
        //ids 查询
        //goodsMapper.findAllById(new HashSet<>());
        PageRequest pageRequest = PageRequest.of(0, 20, Sort.Direction.ASC, "id");
        Page<Goods> goodsPage = goodsMapper.findAll(pageRequest);
        Iterator<Goods> iterator = goodsPage.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }

    //判断是否存在
    @Test
    void test5() {
        goodsMapper.existsById("1001");
    }

    //查询 goodsMapper.search(builder);
    @Test
    void test6() {
        //过时 只能查询没有分词的字段
        //各种Builder
        //MatchQueryBuilder match查询
        //TermsQueryBuilder term 查询
        //ExistsQueryBuilder exists查询
        //BoolQueryBuilder bool 查询
        //MatchQueryBuilder queryBuilder = new MatchQueryBuilder("name","mac");
        TermsQueryBuilder termsQueryBuilder = new TermsQueryBuilder("count", "998");
        Iterable<Goods> goodsPage = goodsMapper.search(termsQueryBuilder);
        Iterator<Goods> iterator = goodsPage.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }

    //分页查询
    @Test
    void testPage() {
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(matchAllQuery())
                .withIndices("es_rest_goods_test")
                .withPageable(PageRequest.of(0, 10))
                .build();

        ScrolledPage<Goods> scroll = elasticsearchTemplate.startScroll(1000, searchQuery, Goods.class);
        String scrollId = scroll.getScrollId();
        List<Goods> content = scroll.getContent();
        content.forEach(item -> {
            System.out.println(item);
        });
        System.out.println(scrollId);
        ScrolledPage<Goods> scroll1 = elasticsearchTemplate.continueScroll(scrollId, 1000, Goods.class);
        String scrollId1 = scroll1.getScrollId();
        List<Goods> content1 = scroll1.getContent();
        content1.forEach(item -> {
            System.out.println(item);
        });
        System.out.println(scrollId1);
        //scrollId1 == scrollId
        elasticsearchTemplate.clearScroll(scrollId);

    }

    //平均
    @Test
    void test7() {
        AvgAggregationBuilder builder = AggregationBuilders.avg("avg_name").field("prise");
        NativeSearchQuery query = new NativeSearchQueryBuilder().addAggregation(builder).withIndices("es_rest_goods_test").build();
        Aggregations aggregations = elasticsearchTemplate.query(query, response -> response.getAggregations());
        // String scrollId = elasticsearchTemplate.query(query, response -> response.getScrollId());
        aggregations.asMap().forEach((key, value) -> {
            ParsedAvg avg = (ParsedAvg) value;
            System.out.println(key + " " + avg.getName() + " " + avg.getValue() + " " + avg.value());
            //avg_name avg_name 149.2098979383412 149.2098979383412
        });

    }

    //去重统计总数
    @Test
    void test8() {
        CardinalityAggregationBuilder builder = AggregationBuilders.cardinality("prise_cardinality").field("prise");
        NativeSearchQuery query = new NativeSearchQueryBuilder().addAggregation(builder).withIndices("es_rest_goods_test").build();
        Aggregations aggregations = elasticsearchTemplate.query(query, response -> response.getAggregations());
        aggregations.asMap().forEach((key, value) -> {
            //prise_cardinality
            System.out.println(key);
            ParsedCardinality parsedCardinality = (ParsedCardinality)value;
            //100
            System.out.println(parsedCardinality.getValue());

        });
    }
    //range查询
    @Test
    void test9() {
        RangeAggregationBuilder rangeAggregationBuilder = AggregationBuilders.range("price_range").field("count")
                .addRange(920,930).addRange(930,940).addRange(940,950);
        NativeSearchQuery query = new NativeSearchQueryBuilder().addAggregation(rangeAggregationBuilder).withIndices("es_rest_goods_test").build();
        Aggregations aggregations = elasticsearchTemplate.query(query, response -> response.getAggregations());
        // String scrollId = elasticsearchTemplate.query(query, response -> response.getScrollId());
        aggregations.asMap().forEach((key, value) -> {
            //price_range
            System.out.println(key);
            ParsedRange range = (ParsedRange) value;
            /**
             * 920.0-930.0 10
             * 930.0-940.0 10
             * 940.0-950.0 10
             */
            range.getBuckets().forEach((bucket)->{
                System.out.println(bucket.getKeyAsString()+" "+bucket.getDocCount());
            });
        });
    }

    //top_hits 根据权值据合
    @Test
    void test10() {
        TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("price_name").field("count");
        TopHitsAggregationBuilder topHitsAggregationBuilder = AggregationBuilders.topHits("top").size(3);
        termsAggregationBuilder.subAggregation(topHitsAggregationBuilder);
        NativeSearchQuery query = new NativeSearchQueryBuilder().addAggregation(termsAggregationBuilder).withIndices("es_rest_goods_test").build();
        Aggregations aggregations = elasticsearchTemplate.query(query, response -> response.getAggregations());
        // String scrollId = elasticsearchTemplate.query(query, response -> response.getScrollId());
        aggregations.asMap().forEach((key, value) -> {
            //price_range
            System.out.println(key);
            ParsedLongTerms parsedLongTerms = (ParsedLongTerms)value;
            parsedLongTerms.getBuckets().forEach((bucket)->{
                Aggregation aggregation = bucket.getAggregations().getAsMap().get("top");
                TopHits topHits= (TopHits) aggregation;
                Iterator<SearchHit> iterator = topHits.getHits().iterator();
                while (iterator.hasNext()){
                    SearchHit next = iterator.next();
                    Object object= JSONObject.parse(next.getSourceAsString());
                    System.out.println(object);
                }
            });
        });
    }


}

java-api
https://jiajun.xyz/2020/10/10/java/es/java-api/
作者
Lambda
发布于
2020年10月10日
更新于
2021年7月25日
许可协议