1、导入Elasticsearch依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
注意这个是parent为低版本的情况下
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.18.RELEASE</version>
</parent>
2、进行yml配置 低版本配置
spring:
data:
elasticsearch:
cluster-name: elasticsearch
cluster-nodes: 192.168.71.120:9300
3、实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
//indexName设置索引名称 type定义类型 shards分片数量 replicas副本 每个分片的复制
@Document(indexName = "idx-emp",type = "emp",shards = 5,replicas = 1)
public class Emp implements Serializable {
@Id
private Integer id;
//type设置数据映射类型 analyzer定义分词片
@Field(type = FieldType.Text,analyzer = "ik_max_word")
private String name;
@Field(type = FieldType.Text,analyzer = "ik_max_word")
private String address;
//keyword另类text类型,不进行分词和索引,可以进行过滤、排序、聚合操作
@Field(type = FieldType.Keyword)
private String sex;
@Field(type = FieldType.Double)
private Double sal;
@Field(type = FieldType.Date)
private Date birthday;
}
4、启动类
@SpringBootApplication
public class EsDemoApplication {
public static void main(String[] args) {
SpringApplication.run(EsDemoApplication.class);
}
}
5、测试类 增删改查的基本用法
先看看Dao持久层
public interface EsDao extends ElasticsearchRepository<Emp,Integer> {
//在持久层内 可以进行自定义sql执行方法
//比如findByNameLike(),可以根据name进行模糊查询,该方法不需要去实现,可直接调用,实例看下面
public List<Emp> findByNameLike(String name);
public List<Emp> findByNameLikeAndSex(String name,String Sex);
}
测试类
@SpringBootTest
@RunWith(SpringRunner.class)
public class EsTest {
@Autowired //持久层对象
private EsDao esDao;
@Autowired //ES模板对象
private ElasticsearchTemplate template;
@After
public void finish(){
System.out.println("已完成。。。。");
}
@Test
public void test(){
//创建索引,会根据 Emp 类的@Document注解信息来创建
template.createIndex(Emp.class);
//映射配置,会根据 Emp 类中的id、Field等字段来自动完成映射
template.putMapping(Emp.class);
}
@Test//插入单个对象
public void test2(){
Emp emp = new Emp(1000, "xxx", "xx", "x", 8000.0, new Date());
esDao.save(emp);
}
@Test//批量插入
public void test3(){
List<Emp> list = new ArrayList<>();
list.add(new Emp(1001, "xxxx", "xxx", "x", 7000.0, new Date()));
list.add(new Emp(1002, "xxxx", "xxx", "x", 6000.0, new Date()));
list.add(new Emp(1003, "xxxx", "xxx", "x", 5000.0, new Date()));
esDao.saveAll(list);//saveAll可以插入用集合批量插入
}
@Test //排序查询
public void test4(){
//查询所有
//Iterable<Emp> list = esDao.findAll();
//进行排序查询
Iterable<Emp> list = esDao.findAll(Sort.by(Sort.Direction.DESC,"sal"));
list.forEach(System.out::println);
}
@Test //自定义sql语句方法
public void test5(){
//findByNameLike() Dao层自定义方法 根据name进行模糊查询
//List<Emp> list = esDao.findByNameLike("x");
//根据name,sex,进行name模糊查询和指定sex查询
List<Emp> list1 = esDao.findByNameLikeAndSex("x","x");
list1.forEach(System.out::println);
}
@Test//ES分词查询
public void test7(){
//词条条件 查询条件
MatchQueryBuilder builder = QueryBuilders.matchQuery("address", "中国广东");
//进行查询
Iterable<Emp> list = esDao.search(builder);
list.forEach(System.out::println);
}
@Test//综合分页查询
public void test8(){
//构建查询条件对象 可以理解为存放查询条件的一个容器
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
//设置查询条件 设置条件根据address字段将 中国xx 进行分词查询
queryBuilder.withQuery(QueryBuilders.matchQuery("address","中国xx"));
//设置分页条件
int pageNo = 0;
int pageSize = 3;
//PageRequest.of()可以在这个方法内放入需要分页的条件
queryBuilder.withPageable(PageRequest.of(pageNo,pageSize));
//排序
queryBuilder.withSort(SortBuilders.fieldSort("sal").order(SortOrder.DESC));
//按照条件进行查询 返回 page 对象实现分页
Page<Emp> page = esDao.search(queryBuilder.build());
//输出查询的数量
System.out.println(page.getTotalElements());
//输出查询的数据详情
page.getContent().forEach(System.out::println);
}
@Test
public void test9(){
//查询构建器
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
//不要明细
queryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{""}, null));
//添加聚合 进行分组
queryBuilder.addAggregation(AggregationBuilders.terms("sexGroup").field("sex")
.subAggregation(AggregationBuilders.max("maxSal").field("sal")));
//执行聚合
AggregatedPage<Emp> search = (AggregatedPage)esDao.search(queryBuilder.build());
//获取桶信息
StringTerms sexGroup = (StringTerms) search.getAggregation("sexGroup");
List<StringTerms.Bucket> buckets = sexGroup.getBuckets();
//遍历桶数据
for (StringTerms.Bucket bucket : buckets){
System.out.println(bucket.getKeyAsString());
System.out.println(bucket.getDocCount());
InternalMax max = (InternalMax) bucket.getAggregations().asMap().get("maxSal");
System.out.println(max.getValue());
}
}
}
本文转载自: https://blog.csdn.net/newoneobjectddd/article/details/123509946
版权归原作者 浪子-海 所有, 如有侵权,请联系我们删除。
版权归原作者 浪子-海 所有, 如有侵权,请联系我们删除。