一:ElasticSearch介绍
ES 是对Lucene进行了封装,开源的、高度可拓展的、可用于大数据存储的全文搜索、分析引擎。
ES 主要特点:分布式、高可用、异步写入。
ES 核心概念:实时|集群|节点(保存数据)|索引|分片(将索引分片)|副本(分片可设置多个副本)
ES 使用案例: 维基百科、Stack Overflow、Github。
二:版本兼容关系
Spring Boot Version (x) | Spring Data Elasticsearch Version (y) | Elasticsearch Version (z) |
---|---|---|
x <= 1.3.5 | y <= 1.3.4 | z <= 1.7.2* |
x >= 1.4.x | 2.0.0 <=y < 5.0.0** | 2.0.0 <= z < 5.0.0** |
三:SpringBoot1.x集成ElasticSearch5.x框架详解
(1)如果框架定型SpringBoot1.5.X以下,那就不能用spring-boot-starter-data-elasticsearch,需要用TransportClient来实现elasticSearch5.X的集成。
(2)下载elasticsearch5.2.2
https://www.elastic.co/downloads/past-releases
(3) 配置文件
config/elasticsearch.yml 主配置文件
config/jvm.options jvm参数配置文件
cofnig/log4j2.properties 日志配置文件
(4) 关键属性配置
属性 | 配置值 | 说明 |
---|---|---|
cluster.name | hsyt | 同一个服务上不同节点通过同一个集群名建立联系 |
node.name | node-1 | 默认的elasticsearch 随机生成uuid的前7个字符作为节点id,可以手工设置 |
path.conf | /path/to/conf | 配置文件的存储路径,默认是es根目录下的config文件夹 |
path.logs | /path/to/logs | 日志文件的存储路径,默认是es根目录下的logs文件夹 |
bootstrap.memory_lock | true | 当jvm开始swap写入交换空间时es的效率会降低,所以要保证它不swap,这对节点健康极其重要。一种方法是将其设置为true |
http.cors.enabled | true | 使用head等监控集群时需要配置 |
http.cors.allow-origin | “*” | 使用head等监控集群时需要配置 |
http.cors.allow-credential | true | 使用head等监控集群时需要配置 |
(5) SpringBoot框架搭建,如下图结构(详见之前我的博客步骤,此处省略)
https://blog.csdn.net/For_niu/article/details/87875470
(5) 服务提供者和服务消费者pom.xml文件配置如下依赖
<properties>
<elasticsearch.version>5.2.2</elasticsearch.version>
</properties>
<dependencies>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>${
elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>${
elasticsearch.version}</version>
</dependency>
</dependencies>
(6) 项目需要的一个数据表结构如下(dao层提供一个全表查询接口,此处省略)
CREATE TABLE `employee` (
`id` bigint(15) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`name` varchar(100) DEFAULT NULL COMMENT '名称',
`sharding_id` bigint(15) DEFAULT NULL COMMENT '分区因子',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1098470660121956355 DEFAULT CHARSET=utf8 COMMENT='mycat数据表';
(7) 创建索引为例介绍微服务实现类代码
@Component
@Service(version = "0.0.1", interfaceClass = TestService.class, registry = "sb", group = "sbTest", timeout = 3000)
public class TestServiceImpl implements TestService {
private static final Logger LOGGER = LoggerFactory.getLogger(TestServiceImpl.class);
@Resource
private TestDao testDao;
private static TransportClient client;
private static Object lock = new Object();
@Value("${elasticSearch.clusterName}")
private String clusterName;
@Value("${elasticSearch.hostList}")
private String hostList;
@Value("${elasticSearch.esIndex}")
private String esIndex;
@Override
public Integer count() {
Integer num = 0;
try {
num = testDao.count();
} catch (Exception e) {
LoggerUtil.error(LOGGER, "统计异常", e.getMessage());
}
return num;
}
@Override
public Integer createEs() {
TransportClient esClient = getClient();
try {
esClient.admin().indices().prepareCreate(esIndex).execute().actionGet();
PutMappingRequest putMapping = Requests.putMappingRequest(esIndex).type(esIndex).source(createMapping(esIndex));
esClient.admin().indices().putMapping(putMapping).actionGet();
} catch (Exception e) {
LoggerUtil.error(LOGGER, "prepareCreate error : {0}", e.getMessage());
}
BulkRequestBuilder bulkRequest = null;
try {
bulkRequest = esClient.prepareBulk();
List<Test> list = testDao.selTest();
for (Test test : list) {
IndexRequest request = esClient.prepareIndex(esIndex, esIndex, test.getId()).setSource(obj2JsonData(test)).request();
bulkRequest.add(request);
}
bulkRequest.execute().actionGet();
} catch (Exception e) {
LoggerUtil.error(LOGGER, "addIndexData error : {0}", e.getMessage());
}
return bulkRequest.numberOfActions();
}
public TransportClient getClient() {
try