springboot集成ES以及ES詳細解讀

Elasticsearch是一個開源的分佈式、RESTful 風格的搜索和數據分析引擎,它的底層是開源庫Apache Lucene。

一.  解讀:

1.ES全文檢索爲什麼能快速高效就是因爲有倒排索引

     倒排索引會對文檔內容進行關鍵詞分詞,可以使用關鍵詞找到對應文檔ID快讀定位文檔內容

      

 

2.節點和集羣(Node & Cluster)

  ES配置文件關鍵配置

集羣名稱 cluster.name: myEs

節點名稱 node.name: master

集羣初始主節點名稱 cluster.initial_master_nodes: ["master"]

一個ES一個節點,多個節點成一個集羣,構成一個分佈式數據庫

3.儲存結構

     索引名 對應數據庫的 庫名 (index)

    索引類型 對應數據庫的 表名(document_type以及type)

      數據唯一索引 對應數據庫 主鍵 (document_id)

 

4.併發安全問題

     進行版本控制的cas無鎖機制(樂觀鎖)

 

 

   

5. 集羣下的分片技術

        分片技術:將數據拆分在多臺節點上存放

       集羣好處:高可用 高容錯性

參考博客

https://blog.csdn.net/xiaochendefendoushi/article/details/82077753

 

二. 安裝及使用

  1.安裝elasticsearch7.5,安裝方法見百度

 

   2.安裝kibana-7.5,安裝方法見百度

 

  3.安裝postpostman,安裝方法見百度

 

   4.添加IK分詞器,方法見百度

 

  5.安裝以及配置logstash,安裝方法見百度

 

  6.以上資源已上傳到我的個人中心可快速下載。

 

 7.springboot集成

        第一步:pom.xml文件yin引包

       

    <!-- spring-boot-starter-data-elasticsearch -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
        <dependency>
		<groupId>org.springframework.data</groupId>
				<artifactId>spring-data-commons</artifactId>
		</dependency>
     <!-- fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.39</version>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.4</version>
        </dependency>

      <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        
        <dependency>
            <groupId>commons-httpclient</groupId>
            <artifactId>commons-httpclient</artifactId>
            <version>3.1</version>
        </dependency>

      第二步:application.yml配置

spring.data.elasticsearch.cluster-name: myEs
#節點的地址 注意api模式下端口號是9300,千萬不要寫成9200(9200http端口9300tcp端口)
spring.data.elasticsearch.cluster-nodes: 192.168.9.7:9300
#spring.data.elasticsearch.repositories.enable: true

       第三步:建立實體映射

    

//注意這裏indexName 和 type id必須對應ES中配置
@Data
@Document(indexName = "account", type = "operation_order", createIndex = false, useServerConfiguration = true)
public class AccOperationOrderEs implements Serializable {

	
	private static final long serialVersionUID = 1L;
	@Id
	private Integer id;
	
	private Long memberId;

    private String accountType;

    private String operationType;

    private String orderId;

    private String sysCode;

    private String sessionId;

    private Integer version;

    private String remark;

    private Date createTime;

    private BigDecimal amount;

    private String memberName;

    public Integer getId() {
        return id;
    }

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

    public Long getMemberId() {
        return memberId;
    }

    public void setMemberId(Long memberId) {
        this.memberId = memberId;
    }

    public String getAccountType() {
        return accountType;
    }

    public void setAccountType(String accountType) {
        this.accountType = accountType == null ? null : accountType.trim();
    }

    public String getOperationType() {
        return operationType;
    }

    public void setOperationType(String operationType) {
        this.operationType = operationType == null ? null : operationType.trim();
    }

    public String getOrderId() {
        return orderId;
    }

    public void setOrderId(String orderId) {
        this.orderId = orderId == null ? null : orderId.trim();
    }

    public String getSysCode() {
        return sysCode;
    }

    public void setSysCode(String sysCode) {
        this.sysCode = sysCode == null ? null : sysCode.trim();
    }

    public String getSessionId() {
        return sessionId;
    }

    public void setSessionId(String sessionId) {
        this.sessionId = sessionId == null ? null : sessionId.trim();
    }

    public Integer getVersion() {
        return version;
    }

    public void setVersion(Integer version) {
        this.version = version;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark == null ? null : remark.trim();
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public BigDecimal getAmount() {
        return amount;
    }

    public void setAmount(BigDecimal amount) {
        this.amount = amount;
    }

    public String getMemberName() {
        return memberName;
    }

    public void setMemberName(String memberName) {
        this.memberName = memberName == null ? null : memberName.trim();
    }
}

第四步:創建查詢接口

@Component
public interface AccOperationOrderRepository extends  ElasticsearchRepository<OperationOrderEs,Integer>{
	
     //自動裝配根據OrderId查詢,參照此格式編寫,下同
     public AccOperationOrderEs findByOrderId(String orderId);

	 public List<AccOperationOrderEs> findByMemberId(Long memberId);

第五步:創建service層

 

@Service
public class AccOperationOrderEsService {
	
	@Resource
	 private AccOperationOrderRepository  accOperationOrderRepository;
	
	 @Resource
	 private ElasticsearchTemplate elasticsearchTemplate;
	 
	 
	 
	 
	 
	 	/**
	     * 批量新增
	     **/
	    
	    public void batchAddAccOperationOrderEs(List<AccOperationOrderEs> accOperationOrderEs) {
	    	
		   if(accOperationOrderEs==null || accOperationOrderEs.size()==0) {
		      return ;
		   }
		   List<IndexQuery> queries = Lists.newArrayListWithExpectedSize(accOperationOrderEs.size());		  
		   IndexQuery indexItem  = null;
		   for(AccOperationOrderEs accOperationOrderE :accOperationOrderEs) {
		       indexItem = new IndexQuery();
		       indexItem.setObject(accOperationOrderE);
		       queries.add(indexItem);
		   }
		   elasticsearchTemplate.bulkIndex(queries);
	    }
	 
	    
	    /**
	     * 新增
	     * @param accOperationOrderEs
	     */
	    public void addAccOperationOrderEs(AccOperationOrderEs accOperationOrderEs) {
	    	accOperationOrderRepository.save(accOperationOrderEs);
	    }

	    /**
	     * 根據id刪除
	     * @param id
	     */
	    public void deletedAccOperationOrderEsById(Integer id) {
	    	accOperationOrderRepository.deleteById(id);
	    }

	    
	    /**
	     * 修改
	     * @param accOperationOrders
	     */
	    public void updateAccOperationOrder(AccOperationOrderEs accOperationOrderEs) {
	 	   UpdateQuery updateQuery = new UpdateQuery();
	 	   updateQuery.setId(accOperationOrderEs.getOrderId());
	 	   updateQuery.setClazz(AccOperationOrderEs.class);
	 	  accOperationOrderEs.setId(null);
	 	   UpdateRequest request = new UpdateRequest();
	 	   request.doc(JsonUtil.objectToJsonString(accOperationOrderEs));
	 	   updateQuery.setUpdateRequest(request);
	 	   elasticsearchTemplate.update(updateQuery);
	     }

	    /**
	     * 查詢所有
	     * @return
	     */
	    public List<AccOperationOrderEs>  queryAll(){
	    	Iterable<AccOperationOrderEs> all = accOperationOrderRepository.findAll();
	    	Iterator<AccOperationOrderEs> allAccOperationOrderEs = all.iterator();
	    	List<AccOperationOrderEs> accOperationOrderEsList= new ArrayList<AccOperationOrderEs>();
	    	while(allAccOperationOrderEs.hasNext()){
	    		accOperationOrderEsList.add(allAccOperationOrderEs.next());
	    	}
	    	return accOperationOrderEsList;
	    }
	    
	    /**
	     * 通過order_id查詢
	     * @param order_id
	     * @return
	     */
	    public AccOperationOrderEs queryByorder_id(String orderId) {
		   return accOperationOrderRepository.findByOrderId(orderId);
	    }

	    /**
	     * 通過Member_id查詢
	     * @param member_id
	     * @return
	     */
	    public List<AccOperationOrderEs> queryByMemberId(Long memberId) {
		   return accOperationOrderRepository.findByMemberId(memberId);
	    }

	    
	    
	    
	 
	

}

 第六步:創建contcontrol層   

 

第七步:核心啓動類添加配置

@EnableAutoConfiguration
@MapperScan(basePackages ="com.pp.mappers")
@EnableElasticsearchRepositories(basePackages = "com.pp.dao")
@SpringBootApplication(scanBasePackages = {"com.pp"})
public class SearchApplication  extends SpringBootServletInitializer {

	public static void main(String[] args) {
		SpringApplication.run(SearchApplication.class, args);
	}

	 private SpringApplicationBuilder config(SpringApplicationBuilder applicationBuilder){
	        return applicationBuilder.sources(SearchApplication.class);
	  }
	
	
	
	
}

  

 

      

 

 

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