天天看點

springBoot整合ElasticSearch「代碼直接複制可用」(超級詳細)

作者:馬士兵馬小小

前期準備工作

安裝Elasticsearch+Kibana

需要先安裝好jdk(這個自行下載下傳安裝,就不過多說了)

官方下載下傳位址點選下載下傳 https://www.elastic.co/cn/downloads/elasticsearch

建議不要下載下傳過高版本的,也不要下載下傳過低版本的,部落客6、7、8版本都下載下傳過,為别再出錯,建議下載下傳和我同一個版本,部落客使用的是7.8.1。具體操作如下:

第一步:

springBoot整合ElasticSearch「代碼直接複制可用」(超級詳細)

第二步:

springBoot整合ElasticSearch「代碼直接複制可用」(超級詳細)

下載下傳指定安裝包後,選擇合适的位置儲存壓縮包,并解壓好,打開bin目錄,在bin裡打開cmd輸入elasticsearch或者直接點選bin目錄下面的slasticsearch.bat檔案:

springBoot整合ElasticSearch「代碼直接複制可用」(超級詳細)
springBoot整合ElasticSearch「代碼直接複制可用」(超級詳細)
springBoot整合ElasticSearch「代碼直接複制可用」(超級詳細)

成功啟動後,由于内部的elasticsearch.yml配置并沒有改動,是以可以直接浏覽器通路http://localhost:9200/如果有一下資訊則證明成功啟動:

springBoot整合ElasticSearch「代碼直接複制可用」(超級詳細)

由于安裝kibana步驟幾乎和elasticsearch一樣,是以就不多說了。

kibana下載下傳位址點選下載下傳 https://www.elastic.co/cn/downloads/past-releases#kibana

經過同樣的步驟操作後就可以浏覽器通路 點選通路 http://localhost:5601/app/kibana#/dev_tools/console

springBoot整合ElasticSearch「代碼直接複制可用」(超級詳細)

在這裡就可以向我們的es中進行資料操作(相當可視化界面)。

最終我們完成了全部的安裝操作。

springboot整合Elasticsearch

配置本地連接配接es檔案

#配置ElaticSearch
spring.elasticsearch.hostname=127.0.0.1
spring.elasticsearch.port=9200           

連接配接配置es

@Configuration
public class EsConfig {
 
//配置本機位址以及端口
    @Value("${spring.elasticsearch.hostname}")
    private String hostname;
    @Value("${spring.elasticsearch.port}")
    private int port;
    /**
     * LowLevelRestConfig
     */
    @Bean
    public RestClient restClient() {
 
        // 如果有多個從節點可以持續在内部new多個HttpHost,參數1是IP,參數2是端口,參數3是通信協定
        RestClientBuilder clientBuilder = RestClient.builder(new HttpHost(hostname, port, "http"));
        // 設定Header編碼
        Header[] defaultHeaders = {
 new BasicHeader("content-type", "application/json")};
        clientBuilder.setDefaultHeaders(defaultHeaders);
        return clientBuilder.build();
    }
    /**
     * HighLevelRestConfig
     */
    @Bean
    public RestHighLevelClient restHighLevelClient() {
 
        // 如果有多個從節點可以持續在内部new多個HttpHost,參數1是IP,參數2是端口,參數3是通信協定
        return new RestHighLevelClient(RestClient.builder(new HttpHost(hostname, port, "http")));
    }
}           

下面就可以開始我們的crud操作了,由于單個子產品發太過于繁瑣,是以我就把我自己簡化的每個層業務代碼都發出來吧!

controller層

@Api(tags = {
 "es"})
@RestController
@RequestMapping("/es")
@Slf4j
public class EsController {
 


    @Autowired
    public RestHighLevelClient restHighLevelClient;
	@Autowired
	private IRestHighLevelClientService restHighLevelClientService;
	@Autowired
	private QueryDataService queryDataService;
	@Autowired
	private UserService userService;

	/**
	 * 建立索引
	 * @return
	 * @throws IOException
	 */
	@RequestMapping("/createIndex")
	@ApiOperation(value = "建立索引", notes = "建立索引")
	public String createIndex(@RequestBody Index index) throws IOException {
 
	     //String indexName = "user";
		restHighLevelClientService.createIndex(index.getIndexName());
		log.info("建立 {} 成功",index.getIndexName());
		return "create "+index.getIndexName()+" success";
	}

	/**
	 * 查詢索引
	 * @return
	 * @throws IOException
	 */
    @GetMapping("/queryIndex")
    @ApiOperation(value = "查詢索引", notes = "查詢索引")
    public GetResponse contextLoads() throws IOException {
 
        GetRequest request = new GetRequest().index("mcy").id("1");
        GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);
		log.info("查詢索引資料:{}",response);
        return  response;
    }

	/**
	 * 查詢資料
	 * @return
	 * @throws IOException
	 */
	@GetMapping("/query")
	@ApiOperation(value = "查詢資料", notes = "查詢資料")
	public JSONArray getData() throws IOException {
 
		List<Mcy> result = new ArrayList<Mcy>();
		result = queryDataService.queryAll();
		JSONArray json = new JSONArray();
		for(Mcy m : result){
 
			JSONObject jo = new JSONObject();
			jo.put("id", m.getId());
			jo.put("name", m.getName());
            jo.put("creator",m.getCreator());
            jo.put("desc",m.getDesc());
            jo.put("price",m.getPrice());
            jo.put("tags",m.getTags());
			json.add(jo);
		}
		log.info("查詢mcyFindAll資料為:{}",result);
		return json;
	}
	/**
	 * 删除索引
	 * @return
	 * @throws IOException
	 */
	@GetMapping("/deleteIndex")
	@ApiOperation(value = "删除索引", notes = "删除索引")
	public String deleteIndex(@RequestBody String indexName) throws IOException {
 
        //String indexName="user";
		AcknowledgedResponse acknowledgedResponse = restHighLevelClientService.deleteIndex(indexName);
		log.info("删除 {} 成功",indexName);
		return "DeleteIndex "+indexName+" success";
	}

	/**
	 * 插入資料
	 * @return
	 * @throws IOException
	 */
	@RequestMapping("/saveDate")
	@ApiOperation(value = "插入資料", notes = "插入資料")
	public void saveDate(@RequestBody User user){
 
		log.info("user: {}",user);
		userService.save(user);
		log.info("插入 {} 成功",user.getName());
	}
	/**
	 * 通過name字段删除資料
	 * @return
	 * @throws IOException
	 */
	@RequestMapping("/deleteUser")
	@ApiOperation(value = "删除資料", notes = "删除資料")
	public String deleteUserByName(@RequestBody User user) throws IOException {
 
		User delUser = getUserByName(user);
        userService.deleteUserById(delUser);
		return "delete:"+user.getName()+"success!";
	}

	/**
	 * 從第一條資料開始查詢,每頁顯示2條
	 * @return
	 * @throws IOException
	 */
	public void DocQueryfy() throws IOException {
 
		SearchRequest request = new SearchRequest("user");
		SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
		builder.from(0);
		builder.size(2);
		request.source(builder);
		SearchResponse response = restHighLevelClient.search(request,RequestOptions.DEFAULT);
		SearchHits hits = response.getHits();
//		System.out.println(hits.getTotalHits());
//		System.out.println(response.getTook());
//		for (SearchHit hit : hits) {
 
//			System.out.println(hit.getSourceAsString());
//		}
		restHighLevelClient.close();
	}
    //私有方法,根據user的name字段值查詢user所有資料(目前主要查詢user的Id)
	private User getUserByName(User user)throws IOException{
 
		User resultUser = new User();
		SearchRequest request = new SearchRequest("user");
		//由于目前trem還不支援中文,是以需要在查詢的字段字段值後加上.keyword,或者下載下傳安裝ik分詞器插件
		request.source(new SearchSourceBuilder().query(QueryBuilders.termQuery("name.keyword",user.getName())));
		SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
		SearchHits hit = response.getHits();
		log.info("hit:{}",hit);
		String id = hit.getHits()[0].getId();
		log.info("id:{}",id);
		resultUser.setId(id);
		resultUser.setName(user.getName());
		return resultUser;
	}

	/**
	 * 通過name字段修改資料
	 * @return
	 * @throws IOException
	 */
	@RequestMapping("/updateUser")
	@ApiOperation(value = "修改資料", notes = "修改資料")
	public String updateUserByName(@RequestBody User user) throws IOException {
 
		User updUser = getUserByName(user);
		updUser.setName(user.getNewName());
		userService.save(updUser);
		return "update:"+user.getName()+"success!";
	}

}           

service層

public interface QueryDataService{
 

    List<Mcy> queryAll();

}

//以及其實作

@Repository
@Service
public class QueryDataServiceImp implements QueryDataService{
 

    @Autowired
    private QueryDataRepository queryDataRepository;

    @Override
    public List<Mcy> queryAll() {
 

        Iterable<Mcy> result = queryDataRepository.findAll();
        List<Mcy> list = Lists.newArrayList(result);
        return list;
    }
}           
public interface UserService {
 

    void save(User user);

    void deleteUserById(User delUser);

}

//以及其實作

@Repository
@Service
public class UserServiceImpl implements UserService{
 

    @Autowired
    private UserRepository userRepository;

    @Override
    public void save(User user) {
 
        userRepository.save(user);
    }

    @Override
    public void deleteUserById(User delUser) {
 
        userRepository.delete(delUser);
    }
}           

repository層

@Repository
public interface QueryDataRepository extends ElasticsearchRepository<Mcy,String>{
 
}
//
public interface UserRepository extends ElasticsearchRepository<User,String> {
 
}           

domain層

@Data
@Document(indexName = "user")
public class User implements Serializable {
 

    @Id
    private String Id;
    private String name;
    private String newName;

}           
@Data
@Document(indexName = "mcy")
public class Mcy implements Serializable {
 
    @Id
    private String id;
    private String name;
    private String creator;
    private String desc;
    private long price;
    private List<String> tags;
}           
@Data
public class Index implements Serializable {
 

    private String indexName;

}           
以上便是整個增删改查操作的所有代碼了,如果您看到了這裡說明代碼還是有點用處的,既然如此就順手來一個點贊、
關注、收藏、評論呗!感謝支援!!!