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。