引入依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<!--SpringBoot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<!--elasticsearch-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.1.1</version>
</dependency>
<!--swagger2-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
</dependency>
<!-- lombok简化注解 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.6</version>
</dependency>
<!-- 阿里FastJson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.39</version>
</dependency>
</dependencies>
添加配置文件application.properties
spring.data.elasticsearch.cluster-name=elasticsearch
spring.data.elasticsearch.cluster-nodes=localhost:9300
spring.data.elasticsearch.local=false
spring.data.elasticsearch.repositories.enabled=true
entity类
/**
* @author 向振华
* @date 2018/11/21 15:48
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
//es注解,设置索引名称以及类型
@Document(indexName = "xzhes", type = "info")
public class EsEntity {
//id(需要添加@Id注解,或会自动识别名称为id的字段为id,其余字段没有限制)
@Id
private Integer id;
//名称
private String name;
//性别
private String sex;
//年龄
private Integer age;
}
Repository类
/**
* @author 向振华
* @date 2018/11/21 16:53
*/
public interface EsRepository extends ElasticsearchRepository<EsEntity, Integer> {
}
service类
/**
* @author 向振华
* @date 2018/11/21 15:54
*/
public interface EsService {
void save(EsEntity esEntity);
List<EsEntity> select(Search search);
}
/**
* @author 向振华
* @date 2018/11/22 10:08
*/
@Service
public class EsServiceImpl implements EsService {
@Resource
private EsRepository esRepository;
@Override
public void save(EsEntity esEntity) {
esRepository.save(esEntity);
}
@Override
public List<EsEntity> select(Search search) {
//创建builder
BoolQueryBuilder builder = QueryBuilders.boolQuery();
//builder下有must、should以及mustNot 相当于sql中的and、or以及not
//设置“名称”模糊搜索
if (search.getName()!=null) {
builder.must(QueryBuilders.matchPhraseQuery("name", search.getName()));
}
//设置“性别”
if (search.getSex()!=null) {
builder.must(new QueryStringQueryBuilder(search.getSex()).field("sex"));
}
//按照年龄从高到低
FieldSortBuilder sort = SortBuilders.fieldSort("age").order(SortOrder.DESC);
//设置分页(拿第一页,一页显示两条)。注意!es的分页api是从第0页开始的(坑)
PageRequest page = new PageRequest(0, 2);
//构建查询
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
//将搜索条件设置到构建中
nativeSearchQueryBuilder.withQuery(builder);
//将分页设置到构建中
nativeSearchQueryBuilder.withPageable(page);
//将排序设置到构建中
nativeSearchQueryBuilder.withSort(sort);
//生产NativeSearchQuery
NativeSearchQuery query = nativeSearchQueryBuilder.build();
//执行
Page<EsEntity> searchs = esRepository.search(query);
//获取总条数(前端分页需要使用)
int total = (int) searchs.getTotalElements();
//获取查询到的数据内容
List<EsEntity> content = searchs.getContent();
return content;
}
}
搜索实体类
/**
* @author 向振华
* @date 2018/11/22 11:02
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Search {
//名称
@ApiModelProperty(value = "名称")
private String name;
//性别
@ApiModelProperty(value = "性别")
private String sex;
//年龄
@ApiModelProperty(value = "年龄")
private Integer age;
}
测试controller
/**
* @author 向振华
* @date 2018/11/21 16:05
*/
@Api(tags = "测试")
@RequestMapping("test")
@RestController
public class TestController {
@Resource
private EsService esService;
@ResponseBody
@GetMapping("/add")
public String add(EsEntity esEntity) {
esService.save(esEntity);
return "success";
}
@ResponseBody
@GetMapping("/select")
public String select(Search search) {
List<EsEntity> entities = esService.select(search);
return JSON.toJSONString(entities);
}
}
启动类
/**
* 启动类(需要先启动elasticsearch.bat)
* @author 向振华
* @date 2018/11/21 15:16
*/
@SpringBootApplication
public class ApplicationMain {
public static void main(String[] args) {
SpringApplication.run(ApplicationMain.class, args);
}
}
注意:
1.启动项目之前需要先启动elasticsearch.bat。
2.可以用chrome浏览器装elasticsearch head插件进行查看。
3.elasticsearch下载地址:https://www.elastic.co/downloads/elasticsearch