ElasticSearch(简称ES)是一个基于Lucene的分布式全文搜索服务器。
Windows下环境搭建
ES依赖Java,需要先安装Java JDK并配置JAVA_HOME环境变量。
安装ES
从(https://www.elastic.co/cn/downloads,或国内镜像)下载ES安装包,并解压。
配置环境变量ES_HOME为ES的目录(如:d:\ES\elasticsearch-7.8.0)。
到bin目录下,点击elasticsearch.bat启动,通过127.0.0.1:9200
访问。
安装head插件
head是ES的集群管理工具,可以用于数据的浏览和查询。
从https://github.com/mobz/elasticsearch-head下载head插件,把crx目录下的es-head.crx重命名为es-head.rar,并解压后,通过chrome的插件加载后即可。
Java客户端
ES提供了两个JAVA REST client版本:
Java Low Level REST Client
: 低级别的REST客户端,通过http与集群交互,用户需自己编组请求JSON串,及解析响应JSON串。兼容所有ES版本。Java High Level REST Client
: 高级别的REST客户端,基于低级别的REST客户端,增加了编组请求JSON串、解析响应JSON串等相关api。使用的版本需要保持和ES服务端的版本一致,否则会有版本问题。
依赖包
为了使用ES客户端,需要在pom.xml中增加依赖(ES的Client版本要与ES版本统一,因此要在Properties中设定所使用的版本):
<properties>
<es.version>7.8.0</es.version>
</properties>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.8.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>7.8.0</version>
</dependency>
client对象
在对ES进行操作前,需要先创建与elasticsearch服务进行连接的RestHighLevelClient对象:
RestHighLevelClient getClient() {
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("127.0.0.1", 9200, "http")
)
);
System.out.println(client);
return client;
}
client使用完后,需要及时关闭。
搜索searchRequest
SearchRequest用于与搜索文档、聚合、定制查询有关的任何操作,还提供了在查询结果的基于上,对于匹配的关键词进行突出显示的方法。
检索的结果保存在SearchHits中:
List<Map<String, Object>> search(List<String> lstIndex, SearchSourceBuilder sourceBuilder){
try(RestHighLevelClient client = getClient()){
SearchRequest reqSearch = new SearchRequest(lstIndex.toArray(new String[0]));
reqSearch.source(sourceBuilder);
SearchResponse respSearch = client.search(reqSearch);
SearchHits hitsSearch = respSearch.getHits();
SearchHit[] aryHits = hitsSearch.getHits();
List<Map<String, Object>> lstResult = new ArrayList<>(aryHits.length);
if(aryHits.length == 0){
_logger.info("No item searched");
return lstResult;
}
for(SearchHit hit : aryHits){
// lstResult.add(hit.getSourceAsString());
lstResult.add(hit.getSourceAsMap());
}
return lstResult;
}
catch (ElasticsearchStatusException ex){
_logger.error("Search fail: {}", ex);
throw new RtcRuntimeException(ErrorCodeEnum.ERROR_ES_Search_Fail.getCode(), ex.toString());
}
catch (Exception ex){
_logger.error("Search fail: {}", ex);
throw new RtcRuntimeException(ErrorCodeEnum.ERROR_ES_Search_Fail);
}
}
查询条件、排序等通过SearchSourceBuilder来构造:
private SearchSourceBuilder buildSearchSource(ListStatsRequest req) {
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
boolQuery.must(QueryBuilders.termQuery("name", "test");
boolQuery.must(QueryBuilders.rangeQuery("count").gt(50));
sourceBuilder.query(boolQuery);
sourceBuilder.from(0);
sourceBuilder.size(100);
sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
sourceBuilder.sort("time");
String[] includeFields = new String[]{"name", "number", "count", "time"};
sourceBuilder.fetchSource(includeFields, null);
return sourceBuilder;
}
查询时可以对多个Index进行查询(通过数组进行传递):
public void listTest(ListTestRequest req){
List<String> lstIndex = buildIndexList(req);
SearchSourceBuilder sourceBuilder = buildSearchSource(req);
List<Map<String, Object>> lstStats = search(lstIndex, sourceBuilder);
// ...
}
Client API网络资源
《Elasticsearch Java Rest Client API 整理总结》系列对ClientAPI介绍的比较详细:
十九种Elasticsearch字符串搜索方式终极介绍
Elasticsearch中如何进行日期(数值)范围查询
通过 Elasticsearch 实现聚合检索 (分组统计)