SpringDataES讲解

1.SpringDataES环境搭建
Spring Data ElasticSearch 基于 spring data API 简化 elasticSearch操作,将原始操作elasticSearch的客户端API
进行封装 。Spring Data为Elasticsearch项目提供集成搜索引擎。Spring Data Elasticsearch POJO的关键功能区域
为中心的模型与Elastichsearch交互文档和轻松地编写一个存储库数据访问层。

1.1 环境搭建
步骤一:Spring-Data-ElasticSearch,Spring-test帮助你加载配置文件并且测试
ESTemplate模板,模板当中包含了一系列的方法

<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>3.1.9.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.elasticsearch.plugin</groupId>
<artifactId>transport‐netty4‐client</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.5.RELEASE</version>
<scope>test</scope>
</dependency>


步骤二:创建Spring的核心配置文件

<!--开启包扫描-->
<context:component-scan base-package="com.wdksoft"/>
<!--配置集群信息-->
<elasticsearch:transport-client id="esClient" cluster-name="my-elasticsearch" cluster-nodes="127.0.0.1:9300,127.0.0.1:9301,127.0.0.1:9302"/>
<!--注入ESTemplate模板-->
<bean id="elasticsearchTemplate" class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
<constructor-arg name="client" ref="esClient"/>
</bean>


2.SpringDataES案例

2.1 添加索引库

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class SpringDataESTest {
//植入模板对象
@Resource
private ElasticsearchTemplate elasticsearchTemplate;

@Test
public void createIndex(){
//创建空的索引库
elasticsearchTemplate.createIndex(Hello.class);

}
}

2.2 添加索引库并且指定Mapping信息
利用POJO映射Mapping信息

@Document(indexName = "my-index",type = "hello")
public class Hello {
@Id
@Field(type = FieldType.Long,index = false,store = true)
private Long id;
@Field(type = FieldType.Text,index = true,store = true,analyzer = "ik_max_word")
private String title;
@Field(type = FieldType.Text,index = true,store = true,analyzer = "ik_max_word")
private String content;
}
@Test
public void createIndex(){
//创建空的索引库
elasticsearchTemplate.+(Hello.class);
elasticsearchTemplate.putMapping(Hello.class);

}


2.3 添加文档数据
创建Mapper层接口:

/**
* 数据访问层接口
*/
@Repository
public interface HelloMapper extends ElasticsearchRepository<Hello,Long> {
}
创建Service层接口
public interface HelloService {
public void save(Hello hello);
}
创建Service层接口实现类
@Service("helloService")
public class HelloServiceImpl implements HelloService {
//植入Mapper层对象
@Resource
private HelloMapper helloMapper;

@Override
public void save(Hello hello) {
helloMapper.save(hello);
}
}
测试:
/**
* 添加文档数据
*/
@Test
public void createDocument(){
Hello hello=new Hello();
hello.setId(1l);
hello.setTitle("新增的Title数据");
hello.setContent("新增的Content数据");
helloService.save(hello);

}

2.4 删除文档数据

Service层接口

//根据文档ID删除
public void deleteById(long id);
//删除全部
public void deleteAll();
Service层接口实现类
@Override
public void deleteById(long id) {
helloMapper.deleteById(id);
}

@Override
public void deleteAll() {
helloMapper.deleteAll();
}

测试:

/**
* 删除文档数据
*/
@Test
public void deleteDocument(){
//根据文档ID删除
helloService.deleteById(1l);
//全部删除
helloService.deleteAll();
}


2.5 修改文档数据

/**
* 修改文档数据:先删除再修改,调用的还是save方法
*/
@Test
public void updateDocument(){
Hello hello=new Hello();
hello.setId(1l);
hello.setTitle("[修改]新增的Title数据");
hello.setContent("[修改]新增的Content数据");
helloService.save(hello);
}


2.6 根据ID查询
Service层接口

//根据文档ID查询数据
public Optional<Hello> findById(Long id);
Service层接口实现类
@Override
public Optional<Hello> findById(Long id) {
return helloMapper.findById(id);
}
测试:
/**
* 根据文档ID查询
*/
@Test
public void getDocumentById(){
Optional<Hello> optional = helloService.findById(2l);
Hello hello = optional.get();
System.out.println(hello);
}

2.7 查询全部文档数据
Service层接口

//查询所有数据
public Iterable<Hello> findAll();
//查询所有数据包含分页
public Page<Hello> findAll(Pageable pageable);
Service层接口实现类
@Override
public Iterable<Hello> findAll() {
return helloMapper.findAll();
}

@Override
public Page<Hello> findAll(Pageable pageable) {
return helloMapper.findAll(pageable);
}

测试:

/**
* 查询所有文档数据
*/
@Test
public void getAllDocument(){
Iterable<Hello> iterable = helloService.findAll();
iterable.forEach(item-> System.out.println(item));
}
/**
* 查询所有文档数据加分页
*/
@Test
public void getDocumentPage(){
//指定分页规则
Page<Hello> page = helloService.findAll(PageRequest.of(0, 5));
for (Hello hello:page.getContent()) {
System.out.println(hello);
}
}


2.8 根据查询方法的自定义规则进行数据查询
根据Title域进行查询,并且加分页
Mapper层接口:

/**
* 数据访问层接口
*/
@Repository
public interface HelloMapper extends ElasticsearchRepository<Hello,Long> {
//根据Title域中的关键词查找数据
public List<Hello> findByTitle(String str);
//根据Title域中的关键词查找数据
public List<Hello> findByTitle(String str, Pageable pageable);
}
Service层接口
//根据Title域中的关键词查找数据
public List<Hello> findByTitle(String str);
//根据Title域中的关键词查找数据
public List<Hello> findByTitle(String str, Pageable pageable);
Service层接口实现类
@Override
public List<Hello> findByTitle(String str) {
return helloMapper.findByTitle(str);
}

@Override
public List<Hello> findByTitle(String str, Pageable pageable) {
return helloMapper.findByTitle(str,pageable);
}

测试: 

/**
* 查询所有文档数据加分页
*/
@Test
public void getDocumentByTitle(){
/*List<Hello> helloLists = helloService.findByTitle("修改");
helloLists.stream().forEach(item-> System.out.println(item));*/

List<Hello> helloLists = helloService.findByTitle("新增", PageRequest.of(0, 5));
helloLists.stream().forEach(item-> System.out.println(item));

}

2.9 NativeSearchQuery

/**
* 根据一段内容查询数据:NativeSearchQuery
*/
@Test
public void getDocumentQuery(){
//创建NativeSearchQueryBuilder对象
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
//指定查询规则
NativeSearchQuery build = nativeSearchQueryBuilder.withQuery(QueryBuilders.queryStringQuery("搜索新增").defaultField("title"))
.withPageable(PageRequest.of(0,5)).build();
//使用ESTemplates执行查询
List<Hello> hellos = elasticsearchTemplate.queryForList(build, Hello.class);
hellos.stream().forEach(item-> System.out.println(item));
}


原文地址:https://www.cnblogs.com/rzbwyj/p/12396297.html