ElasticSearch安装与Java Client API查询


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 实现聚合检索 (分组统计)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值