spring集成elasticsearch并实现基础功能
什么是elasticsearch?
Elasticsearch 是一个基于 Lucene 的开源搜索引擎和分析引擎,它为结构化和非结构化的海量数据提供了实时的搜索、分析和可视化功能。Elasticsearch 是 Elastic Stack(也称为 ELK Stack)的核心组件之一,其他组件还包括 Kibana(用于数据可视化)、Logstash(用于数据收集和处理)。
es 主要是对数据进行搜索,分析,倒排。是一个开源的高扩展的分布式全文搜索引擎。近实时的搜索。
es 的特点:
1、搜索的数据对象大量的非结构化的文本
2、倒排索引
3、每个字段都可以被索引和搜索
docker拉取es镜像
yum install -y yum-utils device-mapper-persistent-data lvm2 docker search elasticsearch docker pull elasticsearch:7.3.1 docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms1024m -Xmx1024m" 3d3aa92f641f
es中文分词插件
https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.3.1/elasticsearch-analysis-ik-7.3.1.zip
插件安装
mkdir /soft/ik 进入容器内部 docker exec -it elasticsearch /bin/bash cd plugins mkdir ik 回到外部 docker cp /soft/ik/. 73438a827b55:/usr/share/elasticsearch/plugins/ik 重启es
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>2.4.2</version>
</dependency>

配置yml的地址
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import java.math.BigDecimal;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(indexName = "subject_index",createIndex = false)
public class SubjectInfoEs {
@Field(type = FieldType.Long)
@Id
private Long id;
@Field(type = FieldType.Text, analyzer = "ik_smart", searchAnalyzer = "ik_smart")
private String subjectName;
@Field(type = FieldType.Text, analyzer = "ik_smart")
private String subjectAnswer;
@Field(type = FieldType.Keyword)
private String createUser;
@Field(type = FieldType.Date, index = false)
private Long createTime;
}
引入继承
ElasticsearchRepository类
import com.jingdianjichi.subject.infra.basic.entity.SubjectInfoEs;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Component;
@Component
public interface SubjectEsRepository extends ElasticsearchRepository<SubjectInfoEs, Long> {
}
接口层
public interface SubjectEsService {
void createIndex();
void addDocs();
void getDocs();
void find();
void search();
}
接口实现层
import com.alibaba.fastjson.JSON;
import com.jingdianjichi.subject.infra.basic.entity.SubjectInfoEs;
import com.jingdianjichi.subject.infra.basic.esRepo.SubjectEsRepository;
import com.jingdianjichi.subject.infra.basic.service.SubjectEsService;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.IndexOperations;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.document.Document;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Service("subjectEsService")
@Slf4j
public class SubjectEsServiceImpl implements SubjectEsService {
@Resource
private ElasticsearchRestTemplate elasticsearchRestTemplate;
@Resource
private SubjectEsRepository subjectEsRepository;
@Override
public void createIndex() {
IndexOperations indexOperations =
elasticsearchRestTemplate.indexOps(SubjectInfoEs.class);
indexOperations.create();
Document mapping = indexOperations.createMapping(SubjectInfoEs.class);
indexOperations.putMapping(mapping);
}
@Override
public void addDocs() {
List<SubjectInfoEs> list = new ArrayList<>();
list.add(new SubjectInfoEs(1l, "redis是什么", "redis是·缓存", "**", new Date().getTime()));
list.add(new SubjectInfoEs(2l, "mysql是什么", "mysql是数据库", "**", new Date().getTime()));
subjectEsRepository.saveAll(list);
}
@Override
public void getDocs() {
}
@Override
public void find() {
subjectEsRepository.findAll().forEach(subjectInfoEs -> {
log.info("subjectInfoEs:{}", JSON.toJSONString(subjectInfoEs));
});
}
@Override
public void search() {
NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.matchQuery("subjectName", "redis"))
.build();
SearchHits<SubjectInfoEs> search = elasticsearchRestTemplate.
search(nativeSearchQuery, SubjectInfoEs.class);
List<SearchHit<SubjectInfoEs>> searchHits = search.getSearchHits();
log.info("searchHits:{}", JSON.toJSONString(searchHits));
}
}
controller层
@GetMapping("testCreateIndex")
public void testCreateIndex() {
subjectEsService.createIndex();
}
@GetMapping("addDocs")
public void addDocs() {
subjectEsService.addDocs();
}
@GetMapping("search")
public void search() {
subjectEsService.search();
}
@GetMapping("find")
public void find() {
subjectEsService.find();
}
索引成功创建并且添加文档

search以及find方法日志打印完成
22:43:06.848 [http-nio-3001-exec-1] INFO
SubjectEsServiceImpl - searchHits:[{"content":{"createTime":1722522746532,"createUser":"**","id":1,"subjectAnswer":"redis是·缓存","subjectName":"redis是什么"},"highlightFields":{},"id":"1","index":"subject_index","innerHits":{},"score":0.6931472,"sortValues":[]}]
22:43:45.486 [http-nio-3001-exec-4] INFO
SubjectEsServiceImpl - subjectInfoEs:{"createTime":1722522746532,"createUser":"**","id":1,"subjectAnswer":"redis是·缓存","subjectName":"redis是什么"}
22:43:45.486 [http-nio-3001-exec-4] INFO
SubjectEsServiceImpl - subjectInfoEs:{"createTime":1722522746532,"createUser":"**","id":2,"subjectAnswer":"mysql是数据库","subjectName":"mysql是什么"}

浙公网安备 33010602011771号