Elasticsearch(三)Spring Data elasticsearch

Spring Data elasticsearch

pom

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

配置文件

spring:
  data:
    elasticsearch:
      # elasticsearch集群名称,默认的是elasticsearch
      cluster-name: elasticsearch
      #节点的地址 注意api模式下端口号是9300,千万不要写成9200
      cluster-nodes: 192.168.25.132:9300
      #是否开启本地存储
      repositories:
        enabled: true
# 异常处理
  elasticsearch:
    rest:
      uris: 192.168.25.132:9200
创建实体

@Document(indexName = "company",type = "employee", shards = 1,replicas = 0, refreshInterval = "-1")
@Data
public class Employee {
    @Id
    @Field(type = FieldType.Keyword)
    private String id;
    @Field(type = FieldType.Text,analyzer = "ik_smart")
    private String firstName;
    @Field(type = FieldType.Text,analyzer = "ik_smart")
    private String lastName;
    @Field(type = FieldType.Keyword)
    private Integer age = 0;
    @Field(type = FieldType.Keyword)
    private String about;

创建索引库
@Test
public void create() {
    //创建索引库
    elasticsearchTemplate.createIndex(Employee.class);
    //设置映射
    elasticsearchTemplate.putMapping(Employee.class);
}

继承spring提接口 ElasticsearchRepository

@Repository
public interface EmployeeRepository extends ElasticsearchRepository<Employee,String> {
    List<Employee> findByAgeBetween();
}
@Test
public void addIndex() {
    Employee employee = new Employee();
    employee.setId("1");
    employee.setFirstName("zhang");
    employee.setLastName("san");
    employee.setAge(22);
    employeeRepository.save(employee);
}

复杂查询

Test
public void search() {
    NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
    //过滤结果
    queryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{"id","firstName"},null));
    //添加查询条件
    queryBuilder.withQuery(QueryBuilders.matchQuery("firstName","张"));
    //排序
    queryBuilder.withSort(SortBuilders.fieldSort("age").order(SortOrder.DESC));
    //分页 页码是从0开始
    queryBuilder.withPageable(PageRequest.of(0,10));
    Page<Employee> search = employeeRepository.search(queryBuilder.build());
    List<Employee> content = search.getContent();
    for (Employee employee : content) {
        System.out.println(employee);
    }
模糊查询
//创建查询条件
MatchQueryBuilder matchQueryBuilder = QueryBuilders
                                        .matchQuery("staffName", staffName)//查询字段
                                        .analyzer("ik_smart")//分词器类型
                                        .minimumShouldMatch("100%");//匹配度
//bool查询
BoolQueryBuilder query = QueryBuilders.boolQuery();
query.must(matchQueryBuilder);
聚合查询
@Test
public void aggr() {
    NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
    //设置聚合字段
    queryBuilder.addAggregation(AggregationBuilders.terms("name").field("age"));

    AggregatedPage<Employee> result = elasticsearchTemplate.queryForPage(queryBuilder.build(), Employee.class);

    //解析聚合
    Aggregations aggr = result.getAggregations();

    //获取指定名称的聚合
    StringTerms terms = aggr.get("name");

    //获取桶
    List<StringTerms.Bucket> buckets = terms.getBuckets();

    for (StringTerms.Bucket bucket : buckets) {
        String keyAsString = bucket.getKeyAsString();
        long docCount = bucket.getDocCount();
        System.out.println("key:"+keyAsString+" Count:"+docCount);
    }
}
聚合统计
 @Test
    public void funSearch() throws ParseException {
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
        QueryBuilder query = QueryBuilders.boolQuery()
                .must(QueryBuilders.rangeQuery("dateTime").gte(new SimpleDateFormat("yyyyMMdd").parse("20190501").getTime())
                        .lte(new SimpleDateFormat("yyyyMMdd").parse("20190601").getTime()));

        queryBuilder.withQuery(query);
        //条件
//        ((BoolQueryBuilder) query).must(QueryBuilders.matchQuery("name","王二"));
        //过滤条件不会影响得分

        //设置聚合字段
        queryBuilder.addAggregation(AggregationBuilders.terms("group_month").field("month")
                .subAggregation(AggregationBuilders.sum("priceSum").field("price3"))//设置组内统计
                .subAggregation(AggregationBuilders.sum("priceSum2").field("price3"))
        );
        //分页
        queryBuilder.withPageable(PageRequest.of(0, 10));
        //排序
        queryBuilder.withSort(SortBuilders.fieldSort("month").order(SortOrder.DESC));

        AggregatedPage<Salary> result = elasticsearchTemplate.queryForPage(queryBuilder.build(), Salary.class);
        List<Salary> content = result.getContent();

        //解析聚合
        Aggregations aggr = result.getAggregations();

        //获取指定名称的聚合
        StringTerms terms = aggr.get("group_month");

        //获取桶
        List<StringTerms.Bucket> buckets = terms.getBuckets();

        for (StringTerms.Bucket bucket : buckets) {
            String keyAsString = bucket.getKeyAsString();
            //获取桶中聚合结果
            Sum priceSum = bucket.getAggregations().get("priceSum");
            System.out.println(priceSum.getValue());
            long docCount = bucket.getDocCount();
            System.out.println("key:"+keyAsString+" Count:"+docCount);
        }
    }

git地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值