https://es.yemengying.com/html
使用SpringBoot整合Elasticsearch,通常都是使用 SpringData 进行封装的,而后在dao层接口继承ElasticsearchRepository 类,该类实现了不少的方法,好比经常使用的CRUD方法。node
首先,在使用以前,先作好相关的准备。web
<dependency>spring
<groupId>org.springframework.boot</groupId>数据库
<artifactId>spring-boot-starter-web</artifactId>app
<version>1.5.9.RELEASE</version>elasticsearch
</dependency>ide
<dependency>spring-boot
<groupId>org.springframework.boot</groupId>测试
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>1.5.9.RELEASE</version>
</dependency>
spring.data.elasticsearch.repositories.enabled = true
spring.data.elasticsearch.cluster-nodes =127.0.0.1\:9300
【注】9300 是 Java 客户端的端口。9200 是支持 Restful HTTP 的接口。
更多的配置:
spring.data.elasticsearch.cluster-name Elasticsearch 集群名。(默认值: elasticsearch)
spring.data.elasticsearch.cluster-nodes 集群节点地址列表,用逗号分隔。若是没有指定,就启动一个客户端节点。
spring.data.elasticsearch.propertie 用来配置客户端的额外属性。
spring.data.elasticsearch.repositories.enabled 开启 Elasticsearch 仓库。(默认值:true。)
@Document(indexName = "userindex", type = "user")
public class User implements Serializable{
private static final long serialVersionUID = 1L;
/** 编号 */
private Long id;
/** 姓名 */
private String name;
/** 年龄 */
private Integer age;
/** 描述 */
private String description;
/** 建立时间 */
private String createtm;
// getter和setter 略
}
【注】使用SpringData的时候,它须要在实体类中设置indexName 和type ,若是和传统型数据库比较的话,就至关于库和表。须要注意的是indexName和type都必须是小写!!!
dao层这里就比较简单了,只需继承ElasticsearchRepository类就好了。其中主要的方法就是 save、delete和search。其中save方法至关如insert和update,没有就新增,有就覆盖。delete方法主要就是删除数据以及索引库。至于search就是查询了,包括一些经常使用的查询,如分页、权重之类的。
public interface UserDao extends ElasticsearchRepository<User, Long>{
}
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
public boolean insert(User user) {
boolean falg=false;
try{
userDao.save(user);
falg=true;
}catch(Exception e){
e.printStackTrace();
}
return falg;
}
public List<User> search(String searchContent) {
QueryStringQueryBuilder builder = new QueryStringQueryBuilder(searchContent);
System.out.println("查询的语句:"+builder);
Iterable<User> searchResult = userDao.search(builder);
Iterator<User> iterator = searchResult.iterator();
List<User> list=new ArrayList<User>();
while (iterator.hasNext()) {
list.add(iterator.next());
}
return list;
}
@Override
public List<User> searchUser(Integer pageNumber, Integer pageSize,String searchContent) {
// 分页参数
Pageable pageable = new PageRequest(pageNumber, pageSize);
QueryStringQueryBuilder builder = new QueryStringQueryBuilder(searchContent);
SearchQuery searchQuery = new NativeSearchQueryBuilder().withPageable(pageable).withQuery(builder).build();
System.out.println("查询的语句:" + searchQuery.getQuery().toString());
Page<User> searchPageResults = userDao.search(searchQuery);
return searchPageResults.getContent();
}
@Override
public List<User> searchUserByWeight(String searchContent) {
// 根据权重进行查询
FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery()
.add(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("name", searchContent)),
ScoreFunctionBuilders.weightFactorFunction(10))
.add(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("description", searchContent)),
ScoreFunctionBuilders.weightFactorFunction(100)).setMinScore(2);
System.out.println("查询的语句:" + functionScoreQueryBuilder.toString());
Iterable<User> searchResult = userDao.search(functionScoreQueryBuilder);
Iterator<User> iterator = searchResult.iterator();
List<User> list=new ArrayList<User>();
while (iterator.hasNext()) {
list.add(iterator.next());
}
return list;
}
}
以后能够对实现进行测试 。
此外,还能够使用Jest Client调用Elasticsearch 的API。