使用RestHighLevelClient連接Elasticsearch


Elasticsearch搜索引擎的簡單連接:

maven導入以下配置:

<dependency>
  <groupId>org.elasticsearch.client</groupId>
  <artifactId>elasticsearch-rest-high-level-client</artifactId>
  <version>7.8.0</version>
</dependency>

<dependency>
  <groupId>org.elasticsearch.client</groupId>
  <artifactId>elasticsearch-rest-client</artifactId>
  <version>7.8.0</version>
</dependency>

<dependency>
  <groupId>org.elasticsearch</groupId>
  <artifactId>elasticsearch</artifactId>
  <version>7.8.0</version>
</dependency>

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>fastjson</artifactId>
  <version>1.2.72</version>
</dependency>

<!-- 以下配置 springboot 項目可忽略 -->
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.7.30</version>
</dependency>

示例:

1. 配置連接客戶端 RestHighLevelClient

@Slf4j
@Configuration
public class MyConfig {

    //超時時間設為5分鍾
    private static final int TIME_OUT = 5 * 60 * 1000;
    private static final int ADDRESS_LENGTH = 2;
    private static final String HTTP_SCHEME = "http";

    private final int connectTimeOut = 1000; // 連接超時時間
    private final int socketTimeOut = 30000; // 連接超時時間
    private final int connectionRequestTimeOut = 500; // 獲取連接的超時時間

    private final int maxConnectNum = 100; // 最大連接數
    private final int maxConnectPerRoute = 100; // 最大路由連接數
    //權限驗證
    final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();

    //    @Value("${elasticsearch.address}")
    private final String[] address = {"localhost:9200"};

    @Bean(name = "restHighLevelClient")
    public RestHighLevelClient restHighLevelClient() {
        HttpHost[] hosts = Arrays.stream(address)
                .map(this::makeHttpHost)
                .filter(Objects::nonNull)
                .toArray(HttpHost[]::new);
        log.debug("hosts:{}", Arrays.toString(hosts));
        System.out.println("hosts:{}" + Arrays.toString(hosts));
        //配置權限驗證
//        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));

        return new RestHighLevelClient(RestClient.builder(hosts)

                .setRequestConfigCallback(
                        requestConfigBuilder ->
                                requestConfigBuilder
                                        .setConnectTimeout(connectTimeOut)
                                        .setSocketTimeout(socketTimeOut)
                                        .setConnectionRequestTimeout(connectionRequestTimeOut))

                .setHttpClientConfigCallback(
                        httpClientBuilder ->
                                httpClientBuilder
                                        .setDefaultCredentialsProvider(credentialsProvider)
                                        .setMaxConnTotal(maxConnectNum)
                                        .setMaxConnPerRoute(maxConnectPerRoute))

                .setRequestConfigCallback(
                        requestConfigBuilder ->
                                requestConfigBuilder.setSocketTimeout(TIME_OUT)));

    }

    /**
     * 處理請求地址
     * @param s address
     * @return HttpHost
     */
    private HttpHost makeHttpHost(String s) {
        assert !Objects.isNull(s);
        String[] address = s.split(":");
        if (address.length == ADDRESS_LENGTH) {
            String ip = address[0];
            int port = Integer.parseInt(address[1]);
            return new HttpHost(ip, port, HTTP_SCHEME);
        } else {
            return null;
        }
    }
}

2. CURD示例:

@Slf4j
@RestController
public class SearchController {

	/**
     * 8.0版本開始將完全移除TransportClient,使用RestHighLevelClient取代
     */
    @Resource
    RestHighLevelClient restHighLevelClient;

    @GetMapping("/index")
    public SearchResponse index() throws IOException {
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        SearchRequest rq = new SearchRequest()
                //索引
                .indices("account")
                //各種組合條件
                .source(sourceBuilder);

        //請求
        System.out.println(rq.source().toString());
        return restHighLevelClient.search(rq, RequestOptions.DEFAULT);
    }

    @GetMapping("/query")
    public String query() throws IOException {

        MatchQueryBuilder matchQueryBuilder = QueryBuilders
                .matchQuery("name", "afred");

        MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders
                .multiMatchQuery("入門", "name", "lastname");

        //查詢條件
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
                .must(matchQueryBuilder)
                .must(multiMatchQueryBuilder);


        //分頁
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder()
                .query(boolQueryBuilder)
                .from(0)
                .size(100)
                .timeout(new TimeValue(60, TimeUnit.SECONDS));

        //查詢
        SearchRequest searchRequest = new SearchRequest()
                .allowPartialSearchResults(true)
				//在es7中使用_doc作為默認的type,並且es8中將會被移除
            	//.types("doc")
                .indices("account")
                .source(sourceBuilder);

        SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println("結果總數:"+ response.getHits().getTotalHits().value);
        SearchHits hits = response.getHits();  //SearchHits提供有關所有匹配的全局信息,例如總命中數或最高分數:
        SearchHit[] searchHits = hits.getHits();
        for (SearchHit hit : searchHits) {
            log.info("search -> {}",hit.getSourceAsString());
        }
        return Arrays.toString(searchHits);
    }

    @GetMapping("/add")
    public String add() throws IOException {
        Map<String, Object> source = new LinkedHashMap<>();
        source.put("name", "嚶嚶嚶?");
        source.put("lastname", "嚶嚶嚶!");
        source.put("job_description", "嚶嚶嚶");
        JSONObject jsonObject = new JSONObject(new LinkedHashMap<>());
        jsonObject.put("type", "person");
        jsonObject.put("source", new JSONObject(source));
        IndexRequest indexRequest = new IndexRequest("account").source(jsonObject.toJSONString(), XContentType.JSON);
        IndexResponse response = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
        log.info("search -> {}", response.toString());
        return response.toString();
    }

    @GetMapping("/delete")
    public String delete(@RequestParam(name = "id") String id) throws IOException {
        DeleteRequest deleteRequest = new DeleteRequest()
                .index("account")
                .id(id)
                .timeout(new TimeValue(60, TimeUnit.SECONDS));
        DeleteResponse response = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
        log.info("search -> {}", response.toString());
        return response.toString();
    }

    @GetMapping("/update")
    public String update() throws IOException {
        Map<String, Object> source = new LinkedHashMap<>();
        source.put("name", "111?");
        source.put("lastname", "222!");
        source.put("job_description", "333");
        JSONObject jsonObject = new JSONObject(new LinkedHashMap<>());
        jsonObject.put("source", new JSONObject(source));
        UpdateRequest updateRequest = new UpdateRequest("account", "ad5ManMB1VCSKbBy8PTJ")
                .doc(jsonObject, XContentType.JSON)
                .retryOnConflict(3)
                .timeout(new TimeValue(60, TimeUnit.SECONDS));
        UpdateResponse response = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
        log.info("search -> {}", response.toString());
        return response.toString();
    }

}


免責聲明!

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



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