ElasticSearch基礎 java操作es歸納


java操作es有2種方式:

1.通過9300端口 tcp ransport-api.jar 但不能適配版本 不建議使用

2.通過9200端口 http Elasticsearch-Rest-Client 官方restclient 建議使用

 

導入依賴

//導入依賴
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.4.2</version>
</dependency>
//導入的版本與es版本一致7.4.2
//打開maven插件看dependencies中管理的依賴es版本是7.9.3
//因為springboot已經對es的版本做了管理 xml重寫下es版本

    <properties>
        <java.version>1.8</java.version>
        <elasticsearch.version>7.4.2</elasticsearch.version>
    </properties>

springboot中es版本也改過來了

 

配置es

//類似數據庫dao配置 代碼通用的

@Configuration
public class GuliESConfig {

    public static final RequestOptions COMMON_OPTIONS;

    static {
        RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
        COMMON_OPTIONS = builder.build();
    }

    @Bean
    public RestHighLevelClient esRestClient() {
        RestClientBuilder builder = null;
        // 可以指定多個es
        builder = RestClient.builder(new HttpHost("192.168.112.151", 9200, "http")
//                ,new HttpHost("host", 9200, "http")
        );
        RestHighLevelClient client = new RestHighLevelClient(builder);
        return client;
    }

}

//其它代碼用到es注入就行了
    @Autowired
    private RestHighLevelClient esRestClient;

 

 

java es保存測試  IndexRequest

   @Autowired
    private RestHighLevelClient esRestClient; 
  /**
     *  保存數據
     * @throws IOException
     */
    @Test
    void indexData() throws IOException{
        //設置保存的索引和id
        IndexRequest indexRequest = new IndexRequest("users");
        indexRequest.id("1");

        //保存的數據 這里指定json類型
        indexRequest.source("{\"test\":1}", XContentType.JSON);

        //執行保存 index同步 indexAsync異步
        IndexResponse index = esRestClient.index(indexRequest, GuliESConfig.COMMON_OPTIONS);
        System.out.println(index);
    }

 

java es 檢索測試 SearchRequest

相當查詢 "query": { "match": { "address": "Mill" } }

    @Test
    public void find() throws IOException {
        // 1 創建檢索請求
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("bank");
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        // 構造檢索條件
//        sourceBuilder.query();
//        sourceBuilder.from();
//        sourceBuilder.size();
//        sourceBuilder.aggregation();
        sourceBuilder.query(QueryBuilders.matchQuery("address","mill"));
        System.out.println(sourceBuilder.toString());

        searchRequest.source(sourceBuilder);

        // 2 執行檢索
        SearchResponse response = esRestClient.search(searchRequest, GuliESConfig.COMMON_OPTIONS);
        // 3 分析響應結果
        System.out.println(response.toString());
    }

查詢結果轉為bean

        // 3.1 獲取java bean   Account是bean類
        SearchHits hits = response.getHits();
        SearchHit[] hits1 = hits.getHits();
        for (SearchHit hit : hits1) {
            hit.getId();
            hit.getIndex();
            String sourceAsString = hit.getSourceAsString();
            Account account = JSON.parseObject(sourceAsString, Account.class);
            System.out.println(account);
        }

 

 

 

 

聚合檢索測試 

搜索address中包含mill的所有人的年齡分布以及平均年齡,平均薪資

GET bank/_search
{
  "query": {
    "match": {
      "address": "Mill"
    }
  },
  "aggs": {
    "ageAgg": {
      "terms": {
        "field": "age",
        "size": 10
      }
    },
    "ageAvg": {
      "avg": {
        "field": "age"
      }
    },
    "balanceAvg": {
      "avg": {
        "field": "balance"
      }
    }
  }
}

java代碼測試如下

    /**
     * 聚合檢索
     * @throws IOException
     */
    @Test
    public void jhfind() throws IOException {
        // 1 創建檢索請求
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("bank");
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        // 構造檢索條件
//        sourceBuilder.query();
//        sourceBuilder.from();
//        sourceBuilder.size();
//        sourceBuilder.aggregation();
        sourceBuilder.query(QueryBuilders.matchQuery("address","mill"));
        //AggregationBuilders工具類構建AggregationBuilder
        // 構建第一個聚合條件:按照年齡的值分布
        TermsAggregationBuilder agg1 = AggregationBuilders.terms("agg1").field("age").size(10);// 聚合名稱
// 參數為AggregationBuilder
        sourceBuilder.aggregation(agg1);
        // 構建第二個聚合條件:平均薪資
        AvgAggregationBuilder agg2 = AggregationBuilders.avg("agg2").field("balance");
        sourceBuilder.aggregation(agg2);

        System.out.println("檢索條件"+sourceBuilder.toString());

        searchRequest.source(sourceBuilder);

        // 2 執行檢索
        SearchResponse response = esRestClient.search(searchRequest, GuliESConfig.COMMON_OPTIONS);
        // 3 分析響應結果
        System.out.println(response.toString());
    }

檢索結果處理

// 3.2 獲取檢索到的分析信息
//實際測試檢索結果aggregations下名稱不是"agg2"而是"avg#agg2"  不是"agg1"而是"lterms#agg1" 暫不知道是什么原因 先記錄着
Aggregations aggregations = response.getAggregations();
Terms agg21 = aggregations.get("agg2"); //"avg#agg2"  
for (Terms.Bucket bucket : agg21.getBuckets()) {
    String keyAsString = bucket.getKeyAsString();
    System.out.println(keyAsString);
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM