springboot elasticsearch CRUD+
java版本:1.8
elasticSearch官網(wǎng)是比任何其他博客都正規(guī)的學(xué)習(xí)平臺
https://www.elastic.co/cn/elasticsearch/
教學(xué)地址
https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html
我的項目是下載了elastic冷守,本地運行自己玩
Staff
@Document(indexName="department")
publicclassStaff{
@Id
privateStringid;
@Field
privateStringfirstName;
@Field
privateStringlastName;
@Field
privateIntegerage=0;
@Field
privateStringabout;
publicStringgetId() {
returnid;
?? }
publicvoidsetId(Stringid) {
this.id=id;
?? }
publicStringgetFirstName() {
returnfirstName;
?? }
publicvoidsetFirstName(StringfirstName) {
this.firstName=firstName;
?? }
publicStringgetLastName() {
returnlastName;
?? }
publicvoidsetLastName(StringlastName) {
this.lastName=lastName;
?? }
publicIntegergetAge() {
returnage;
?? }
publicvoidsetAge(Integerage) {
this.age=age;
?? }
publicStringgetAbout() {
returnabout;
?? }
publicvoidsetAbout(Stringabout) {
this.about=about;
?? }
}
[@Document(indexName = "department")]?index名役电,文件名設(shè)置為department
StaffController
@RestController
@RequestMapping("/elasticSearch")
publicclassStaffController{
@Autowired
privateStaffNewServicestaffNewService;
@ResponseBody
@GetMapping("/saveStaff")
publicStringsaveStaff(@RequestBodyStaffstaff){
staffNewService.saveStaff(staff);
return"saved";
?? }
@ResponseBody
@RequestMapping("/deleteStaff")
publicStringdeleteStaff(@RequestParamStringid){
staffNewService.deleteStaff(id);
return"deleted";
?? }
@ResponseBody
@RequestMapping("/updateStaff")
publicStringupdateStaff(@RequestParamStringid,@RequestParamStringfirstName){
staffNewService.updateStaff(id,firstName);
return"updated";
?? }
//以下都是按照firstName搜索
@ResponseBody
@RequestMapping("/matchAllQuery")//搜索該field(索引)內(nèi)全部信息
publicStringmatchAllQuery(@RequestParamStringfield)throwsIOException{
SearchResponsesearchResponse=staffNewService.matchAllQuery(field);
return"matchAllQuery"+searchResponse;
?? }
@ResponseBody
@RequestMapping("/regexpQuery")//以一句話里的單詞為關(guān)鍵字查詢該句話,不能以一個單詞里的幾個字母作為關(guān)鍵字搜索該詞伟众。這就和mongo里的regex不一樣理张,它能做后者赫蛇。
publicStringregexpQuery(@RequestParamStringfield,@RequestParamStringkeyword)throwsIOException{
SearchResponsesearchResponse=staffNewService.regexpQuery(field,keyword);
return"regexpQuery"+searchResponse;
?? }
@ResponseBody
@RequestMapping("/fuzzyQuery")//首先,他會把我正確的keyword全改成小寫雾叭,兩個字符出錯
// (漏了悟耘,多了,i變j了织狐,只要總數(shù)是2以內(nèi))就查得出來暂幼,多了不行
publicStringfuzzyQuery(@RequestParamStringfield,@RequestParamStringkeyword)throwsIOException{
SearchResponsesearchResponse=staffNewService.fuzzyQuery(field,keyword);
return"fuzzyQuery"+searchResponse;
?? }
@ResponseBody
@RequestMapping("/termQuery")//如果正確的沒空格,也是先會把我正確的keyword變成小寫移迫,再搜索旺嬉,要完全一樣才行
// 如果原來的有空格,搜索第一串字符串才能搜出來(還是小寫厨埋,即使正確的是大寫)
publicStringtermQuery(@RequestParamStringfield,@RequestParamStringkeyword)throwsIOException{
SearchResponsesearchResponse=staffNewService.termQuery(field,keyword);
return"termQuery"+searchResponse;
?? }
@ResponseBody
@RequestMapping("/matchQuery")//大小寫隨便,空格不能漏
publicStringmatchQuery(@RequestParamStringfield,@RequestParamStringkeyword)throwsIOException{
SearchResponsesearchResponse=staffNewService.matchQuery(field,keyword);
return"matchQuery"+searchResponse;
?? }
}
StaffRepository(基本用不到)
@Component
publicinterfaceStaffRepositoryextendsElasticsearchRepository<Staff,String>{
/**
* 根據(jù)ID 查詢員工信息
*
* @param id id
* @return Staff
*/
StaffqueryStaffById(Stringid);
}
StaffNewService
@Service
@Component
publicinterfaceStaffNewService{
/**
* 新增員工測試
*
* @return String
*/
publicvoidsaveStaff(Staffstaff) ;
/**
* 刪除測試
*
* @return
*/
publicvoiddeleteStaff(Stringid) ;
/**
* 更新
* @return
*/
publicvoidupdateStaff(Stringid,StringfirstName) ;
/**
* 查詢
* @return
*/
publicvoidqueryStaff(Stringid) ;
publicSearchResponsematchAllQuery(Stringfield)throwsIOException;
publicSearchResponseregexpQuery(Stringfield,Stringkeyword)throwsIOException;
publicSearchResponsefuzzyQuery(Stringfield,Stringkeyword)throwsIOException;
publicSearchResponsetermQuery(Stringfield,Stringkeyword)throwsIOException;
publicSearchResponsematchQuery(Stringfield,Stringkeyword)throwsIOException;
}
StaffNewServiceImpl
@Service
@Component
publicclassStaffNewServiceImplimplementsStaffNewService{
@Autowired
privateStaffRepositorystaffRepository;
@Resource
privateElasticsearchRestTemplateelasticsearchRestTemplate;
/**
* 新增員工測試
*
* @return String
*/
publicvoidsaveStaff(Staffstaff) {
staffRepository.save(staff);
?? }
/**
* 刪除測試
*
* @return
*/
publicvoiddeleteStaff(Stringid) {
Staffstaff=staffRepository.queryStaffById(id);
staffRepository.delete(staff);
?? }
/**
* 更新
* @return
*/
publicvoidupdateStaff(Stringid,StringfirstName) {
Staffstaff=staffRepository.queryStaffById(id);
staff.setFirstName(firstName);
staffRepository.save(staff);
?? }
/**
* 查詢
* @return
*/
publicvoidqueryStaff(Stringid) {
Staffstaff=staffRepository.queryStaffById("1");
?? }
publicSearchResponsematchAllQuery(Stringfield)throwsIOException{
RestHighLevelClientclient=newRestHighLevelClient(RestClient.builder(
newHttpHost("127.0.0.1",9200,"http")));
SearchSourceBuildersearchSourceBuilder=newSearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
SearchRequestsearchRequest=newSearchRequest();
searchRequest.indices(field);
searchRequest.source(searchSourceBuilder);
SearchResponsesearchResponse=client.search(searchRequest,RequestOptions.DEFAULT);
returnsearchResponse;
?? }
/**
*? 帶分頁邪媳、權(quán)重、分域查詢
* @param field 索引
* @param keyword 關(guān)鍵字
* @return staff集合
*/
publicSearchResponseregexpQuery(Stringfield,Stringkeyword)throwsIOException{
RestHighLevelClientclient=newRestHighLevelClient(RestClient.builder(
newHttpHost("127.0.0.1",9200,"http")));
SearchSourceBuildersearchSourceBuilder=newSearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.regexpQuery("firstName",keyword));
SearchRequestsearchRequest=newSearchRequest();
searchRequest.indices(field);
searchRequest.source(searchSourceBuilder);
SearchResponsesearchResponse=client.search(searchRequest,RequestOptions.DEFAULT);
returnsearchResponse;
?? }
publicSearchResponsefuzzyQuery(Stringfield,Stringkeyword)throwsIOException{
RestHighLevelClientclient=newRestHighLevelClient(RestClient.builder(
newHttpHost("127.0.0.1",9200,"http")));
SearchSourceBuildersearchSourceBuilder=newSearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.fuzzyQuery("firstName",keyword));
SearchRequestsearchRequest=newSearchRequest();
searchRequest.indices(field);
searchRequest.source(searchSourceBuilder);
SearchResponsesearchResponse=client.search(searchRequest,RequestOptions.DEFAULT);
returnsearchResponse;
?? }
publicSearchResponsetermQuery(Stringfield,Stringkeyword)throwsIOException{
RestHighLevelClientclient=newRestHighLevelClient(RestClient.builder(
newHttpHost("127.0.0.1",9200,"http")));
SearchSourceBuildersearchSourceBuilder=newSearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.termQuery("firstName",keyword));
SearchRequestsearchRequest=newSearchRequest();
searchRequest.indices(field);
searchRequest.source(searchSourceBuilder);
SearchResponsesearchResponse=client.search(searchRequest,RequestOptions.DEFAULT);
returnsearchResponse;
?? }
publicSearchResponsematchQuery(Stringfield,Stringkeyword)throwsIOException{
RestHighLevelClientclient=newRestHighLevelClient(RestClient.builder(
newHttpHost("127.0.0.1",9200,"http")));
SearchSourceBuildersearchSourceBuilder=newSearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery("firstName",keyword));
SearchRequestsearchRequest=newSearchRequest();
searchRequest.indices(field);
searchRequest.source(searchSourceBuilder);
SearchResponsesearchResponse=client.search(searchRequest,RequestOptions.DEFAULT);
returnsearchResponse;
?? }
}
[HttpHost]?程序里生成客戶端,這樣不需要加什么插件就能讀取elastic里的索引雨效,文件了套菜。
DemoApplication
@Service
@SpringBootApplication
publicclassDemoApplication{
publicstaticvoidmain(String[]args){
SpringApplication.run(DemoApplication.class,args);
?? }
}
application.properties
#ES
spring.data.elasticsearch.repositories.enabled=true
spring.data.elasticsearch.cluster-nodes=127.0.0.1:9200
本地程序運行端口默認是8080,所以postman調(diào)用接口時的端口時8080设易。
但是elasticSearch默認是在9200運行的逗柴。
不要搞混!6俜巍戏溺!
我就主要玩了一下searchSourceBuilder里的各種query,aggregation好像主要做的是數(shù)據(jù)統(tǒng)計屠尊,這個我沒玩旷祸。