SpringBoot集成ElasticSearch以及通過ElasticSearch的Java API實現增刪改查

一、簡介

ElasticSearch,簡稱ES, 是一個基於Lucene的分佈式可擴展的實時搜索和分析引擎,是基於分詞和分段的全文搜索引擎,具有分詞,同義詞,詞幹查詢的功能,ES天生具有分佈式和實時的屬性。當然 Elasticsearch 並不僅僅是 Lucene 那麼簡單,它不僅包括了全文搜索功能,還可以進行以下工作:

分佈式實時文件存儲,並將每一個字段都編入索引,使其可以被搜索。ElasticSearch 的實現原理主要分爲以下幾個步驟:

1.用戶將數據提交到Elastic Search 數據庫中。

2.通過分詞控制器去將對應的語句分詞,將其權重和分詞結果一併存入數據,

3.當用戶搜索數據時候,再根據權重將結果排名,打分。

4.將返回結果呈現給用戶。

二、基本概念

先說Elasticsearch的文件存儲,Elasticsearch是面向文檔型數據庫,一條數據在這裏就是一個文檔,用JSON作爲文檔序列化的格式,比如這條JSON格式的用戶數據:{ "id" : 1, "name" : "ZhangSan", "sex" : "Male","age" : 25 }

如果用Mysql這樣的關係型數據庫存儲,我們容易想到建立一張User表,有id,name,sex,age字段,在Elasticsearch中,這些數據就是一個文檔,當然這個文檔會屬於一個User的類型,各種各樣的類型存在一個索引中。這裏通過下面對照表,將Elasticsearch和關係型數據術語進行對照:

關係數據庫 數據庫      (Columns)

Elasticsearch:  索引(Index)  類型(type)  文檔(Docments)  字段(Fields)

其餘的專業術語以及相關概念知識網上很多,開發者敬請自行去查看,此處不再贅述,下面通過完整的案例來演示從ES環境搭建到ES實現增刪改查功能以及ES的常規的Java API。

三、環境搭建

1、安裝Java環境

下載安裝Java JDK和配置JAVA_HOME環境變量,建議1.8及以上版本的JDK

2、搭建ElasticSearch環境

這裏筆者安裝的6.3.1的版本,點擊這裏去官網下載安裝包安裝教程非常簡單,自行百度。安裝完記得修改配置文件配置 elasticsearch-6.3.1/config/elasticsearch.yml。

# 集羣名字
cluster.name: es-6.3.1-test
# 節點名字
node.name: node-101
# 標識master節點
node.master: true
# 設成0.0.0.0讓任何人都可以訪問,線上服務不要這樣設置。
network.host: 0.0.0.0
http.port: 9200
# 解決elasticsearch-head 集羣健康值: 未連接問題
http.cors.enabled: true
http.cors.allow-origin: "*"

3、安裝Nodejs環境

按照下面的head插件之前 首先要安裝Nodejs,下載地址:https://nodejs.org/en/,安裝完之後配置環境變量NODE_HOME

4、安裝head插件

爲了便於管理ES,通常使用elasticsearch-head-master(簡稱head)插件,這是一款ES的客戶端可視化管理工具,在瀏覽器中顯示ES集羣,索引等信息,十分簡便好用。(其實也就相當於mysql的客戶端可視化工具Navicat )

點這裏下載,下載後解壓elasticsearch-head-master到 D:\elasticsearch-6.3.1\elasticsearch-head-master目錄 在elasticsearch-head-master目錄下執行npm install 安裝依賴,安裝完依賴修改插件配置文件,修改服務器監聽地址:Gruntfile.js   grunt 是基於Node.js的項目構建工具,可以進行打包壓縮、測試、執行等工作,head插件就是通過grunt啓動。

connect: {
  server: {
	options: {
		port: 9100,
		base: '.',
		keepalive: true,
		hostname: '*'
	}
  }
}

在插件目錄執行 grunt server 命令 啓動運行head服務 ,如下圖表示啓動成功。

訪問head管理頁面,地址:http://localhost:9100/ ,界面如下:

到此服務端環境搭建好了,下面通過一個springboot項目通過ES的Java API實現增刪改查功能

四、通過Elasticsearch的Java API實現增刪改查

首先創建一個springboot項目,在application.yml修改添加以下配置

spring: 
  application:
    name: springboot-elasticsearch
  instance:
    instance-id: ${spring.application.name}:${server.port} 
  data:
    elasticsearch:
      repositories:
        abled: true
      # 此處填寫剛纔搭建的服務端環境的IP地址,集羣的話,多個之間逗號隔開
      cluster-nodes: 127.0.0.1:9300
      # 集羣名字,跟服務端環境配置文件裏的名字保持一致
      cluster-name: es-6.3.1-test

pom文件添加elasticsearch的客戶端依賴

<dependency>
  <groupId>org.elasticsearch.client</groupId>
  <artifactId>elasticsearch-rest-client</artifactId>
 </dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

創建User實體信息,注意註解@Document的屬性indexName和type的值,不支持駝峯規則。

這裏的indexName 和type ,如果和傳統型數據庫比較的話,就相當於。需要注意:indexNametype都必須是小寫!

@Document(indexName = "sysuser", type = "user")
public class User implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = -595647652352120839L;
	
	@Id
	private String id;

	private String userName;
	
	private String password;
	
	private Integer sex;

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public Integer getSex() {
		return sex;
	}

	public void setSex(Integer sex) {
		this.sex = sex;
	}
	
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}
}

下面編寫接口的Controller

@Controller
@RequestMapping(value="/es/demo")
public class UserController {

	@Autowired
	private IUserService   userServiceImpl;
	
	@GetMapping(value = "/getList")
	@ResponseBody
	public List<User> getList(@RequestParam("name") String name){
		List<User> list = userServiceImpl.getByName(name);
		return list;
	}
	
	@PostMapping(value = "/create")
	@ResponseBody
	public boolean create(@RequestBody User u){
		boolean flag = userServiceImpl.insert(u);
		return flag;
	}
}

下面編寫接口的Service

public interface IUserService {

	public List<User> getByName(String name);
	
	public boolean insert(User user) ;
}

下面編寫接口的Service實現類

@Service
public class UserServiceImpl implements IUserService {

	@Autowired
	private UserMapper<?>  userMapper;
	
	
	@Override
	public List<User> getByName(String name) {
		QueryBuilder builder = QueryBuilders.prefixQuery("userName",name);
		//QueryBuilder builder = new QueryStringQueryBuilder(name);
		System.out.println("前綴模糊查詢的語句:"+builder);
		Iterable<User> searchResult = userMapper.search(builder);
        Iterator<User> iterator = searchResult.iterator();
        List<User> list=new ArrayList<User>();
        while (iterator.hasNext()) {
          list.add(iterator.next());
        }
     return list;
	}

	@Override
	public boolean insert(User user) {
		boolean falg=false;
        try{
        	userMapper.save(user);
            falg=true;
        }catch(Exception e){
            e.printStackTrace();
        }
        return falg;
	}
}

現在在postman上請求數據創建create接口 http://localhost:8080/es/demo/create,創建幾條數據,然後請求查詢接口getList,對字段userName通過關鍵字"guo"搜索,可以看到請求的數據是正常的,同時在控制檯也打印出了下面的查詢日誌信息

前綴模糊查詢的語句:{
  "prefix" : {
    "userName" : {
      "value" : "guo",
      "boost" : 1.0
    }
  }
}

到此通過完整的流程通過springboot項目集成elasticsearch以及通過ES的Java API實現了增刪改查,更多高級功能敬請期待下次教程以及案例分享,聯繫筆者請假微信:18629374628

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章