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);
}
}