Elasticsearch是一个开源的分布式、RESTful 风格的搜索和数据分析引擎,它的底层是开源库Apache Lucene。
一. 解读:
1.ES全文检索为什么能快速高效就是因为有倒排索引
倒排索引会对文档内容进行关键词分词,可以使用关键词找到对应文档ID快读定位文档内容
倒排索引就是相当于把关系型数据库的key(id)找value换成 value找key(id),利用分词器把value分成单个词语。
如下图例:
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. 集群下的分片技术
分片技术:将数据拆分在多台节点上存放
集群好处:高可用 高容错性
参考博客
ElasticSearch 学习记录之 分布式文档存储往ES中存数据和取数据的原理_灰寨小学的python---小陈-CSDN博客
二. 安装及使用
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);
}
}