前期準備工作
安裝Elasticsearch+Kibana
需要先安裝好jdk(這個自行下載下傳安裝,就不過多說了)
官方下載下傳位址點選下載下傳 https://www.elastic.co/cn/downloads/elasticsearch
建議不要下載下傳過高版本的,也不要下載下傳過低版本的,部落客6、7、8版本都下載下傳過,為别再出錯,建議下載下傳和我同一個版本,部落客使用的是7.8.1。具體操作如下:
第一步:
第二步:
下載下傳指定安裝包後,選擇合适的位置儲存壓縮包,并解壓好,打開bin目錄,在bin裡打開cmd輸入elasticsearch或者直接點選bin目錄下面的slasticsearch.bat檔案:
成功啟動後,由于内部的elasticsearch.yml配置并沒有改動,是以可以直接浏覽器通路http://localhost:9200/如果有一下資訊則證明成功啟動:
由于安裝kibana步驟幾乎和elasticsearch一樣,是以就不多說了。
kibana下載下傳位址點選下載下傳 https://www.elastic.co/cn/downloads/past-releases#kibana
經過同樣的步驟操作後就可以浏覽器通路 點選通路 http://localhost:5601/app/kibana#/dev_tools/console
在這裡就可以向我們的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;
}
以上便是整個增删改查操作的所有代碼了,如果您看到了這裡說明代碼還是有點用處的,既然如此就順手來一個點贊、
關注、收藏、評論呗!感謝支援!!!