很多时候一个项目不仅会使用到关系型数据库(Mysql等),也可能会使用到非关系型数据库,在这之中ElasticSearch就是一个佼佼者。而使用RestAPI的方式去访问ElasticSearch无疑是一个很可以的方法。
当然成功的访问到ES数据库需要做到一下几步。
一、在项目里添加相关的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
另外还有Jest的相关依赖:
<dependency>
<groupId>io.searchbox</groupId>
<artifactId>jest</artifactId>
</dependency>
二、对Jest进行配置
spring:
elasticsearch:
jest:
connection-timeout: 3000
multi-threaded: true
uris: http://xxx.xx.xxx.xxx:9200
read-timeout: 7200
访问地址便是服务器地址,端口默认是9200(不排除进行了修改),其它的相关属性也可根据自身需要自行设置。
三、访问ES数据库
import com.google.gson.JsonObject;
import io.searchbox.client.JestClient;
import io.searchbox.client.JestResult;
import io.searchbox.core.Search;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.io.IOException;
/**
* @Author Kolloge
* @Project esdemo
* @Date 2018/11/13 10:00
* @Description
**/
@Service("esService")
public class EsInfoImpl implements EsInfo {
private final Logger logger = LoggerFactory.getLogger(EsInfoImpl.class);
@Value("${es.index}")
private String indexName;
@Value("${es.type}")
private String typeName;
@Autowired
private JestClient jestClient;
@Override
public JsonObject searchInformation(String id) {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery("填写你要查找的keyname",id));
Search search = new Search.Builder(searchSourceBuilder.toString()).addIndex(indexName).addType(typeName).build();
try{
JestResult jestResult = jestClient.execute(search);
logger.info("获取ES信息成功!");
return jestResult.getJsonObject();
}catch (SearchESException | IOException e){
logger.error("获取ES信息异常:" + e.getMessage());
return null;
} catch (Exception e){
logger.error("获取ES信息异常:" + e.getMessage());
e.printStackTrace();
return null;
}
}
}
此处的index_name和type_name需要根据自身情况进行设置。此处没有贴出interface,务必自行根据impl写出interface。
需要注意的事情是,此处的结果JsonObject是gson的格式,所以可能还需要添加gson的依赖:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
拿到了Json之后自然是想怎么使用就怎么使用了。若是想要将结果直接放入实体中:SpringBoot下Jest实现ElasticSearch查询结果直接写入实体对象中
四、集群访问的方法
其实到上一步的时候所有的操作就已经结束了,程序已经可以正常的访问ES数据库并且拿到相关的数据。但是很多时候ES肯定不止一台服务器,一般都是集群搭建。那么这样的情况下又该如何操作呢?
其实以上的配置完全就可以访问集群的ES数据库,只需要改一下配置文件就可以轻松的实现既修改第二步的操作:
spring:
elasticsearch:
jest:
connection-timeout: 3000
multi-threaded: true
uris:
- http://xxx.xx.xxx.xxx:9200
- http://yyy.xx.xxx.xxx:9200
read-timeout: 7200
有多少就加多少URI进去,集群访问也十分便捷。整体的实现也是相当的简单。