动态

详情 返回 返回

elasticsearch7.17-RestHighLevelClient查詢es - 动态 详情

1. elasticsearch-highlevel-api

1.1 依賴

    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-client</artifactId>
        <version>7.17.15</version>
    </dependency>
    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-high-level-client</artifactId>
        <version>7.17.15</version>
    </dependency>
    <dependency>
        <groupId>org.elasticsearch</groupId>
        <artifactId>elasticsearch</artifactId>
        <version>7.17.15</version>
        <exclusions>
            <exclusion>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-api</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-core</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

1.2 代碼-controller-service-impl

1.2.1 controller

package com.niewj.ssdemo.web;
import com.niewj.ssdemo.model.entity.BookDb;
import com.niewj.ssdemo.service.SearchEsService;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
 * ES相關測試
 *
 * @author niewj
 * @date 2025/9/5 17:33
 */
@RestController
public class SearchEsController {
  @Resource private SearchEsService searchEsService;
  @RequestMapping(value = "/getByIds")
  public List<BookDb> sayHello(@RequestBody List<String> ids) {
    return searchEsService.search(ids);
  }
  @RequestMapping(value = "/queryTitleAndSummary")
  public List<BookDb> queryTitleAndSummary(@RequestParam String searchKey) {
    return searchEsService.queryTitleAndSummary(searchKey);
  }
}

1.2.2 service

package com.niewj.ssdemo.service;
import com.niewj.ssdemo.model.entity.BookDb;
import java.util.List;
/**
 * es數據查詢接口
 *
 * @date 2025/9/5 15:06
 */
public interface SearchEsService {
    /**
     * 查詢es數據
     * @param ids
     * @return
     */
    List<BookDb> search(List<String> ids);
    /**
     * 根據標題和摘要查詢
     * @param searchKey
     * @return
     */
    List<BookDb> queryTitleAndSummary(String searchKey);
}

1.2.3 service-impl

package com.niewj.ssdemo.service.impl;

import com.alibaba.fastjson.JSON;
import com.niewj.ssdemo.config.es.EsProperties;
import com.niewj.ssdemo.model.entity.BookDb;
import com.niewj.ssdemo.service.SearchEsService;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.MultiMatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.stereotype.Service;

/**
 * es查詢實現類
 */
@Slf4j
@Service
public class EsHightLevelServiceImpl<T> implements SearchEsService {
  /** highlight查詢 */
  @Resource private RestHighLevelClient restHighLevelClient;
  @Resource private EsProperties esProperties;
  @Override
  public List<BookDb> search(List<String> ids) {
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    BoolQueryBuilder queryBuilder = searchCondition(ids);
    if (queryBuilder == null) {
      return null;
    }
    searchSourceBuilder.query(queryBuilder);
    // 設置排序
    searchSourceBuilder.sort(SortBuilders.fieldSort("publish_date").order(SortOrder.DESC));
    List<BookDb> dataList = searchAndGetData(searchSourceBuilder);
    return dataList;
  }

  @Override
  public List<BookDb> queryTitleAndSummary(String searchKey) {
    SearchSourceBuilder ssBuilder = new SearchSourceBuilder();
    MultiMatchQueryBuilder queryBuilder =
        QueryBuilders.multiMatchQuery(searchKey, "title", "summary").minimumShouldMatch("1");
    ssBuilder.query(queryBuilder);
    ssBuilder.sort(SortBuilders.fieldSort("publish_date").order(SortOrder.DESC));
    List<BookDb> dataList = searchAndGetData(ssBuilder);
    return dataList;
  }

  /**
   * 查詢並返回結果列表
   *
   * @param searchSourceBuilder
   * @return
   */
  private List<BookDb> searchAndGetData(SearchSourceBuilder searchSourceBuilder) {
    // 構建入參
    SearchRequest searchRequest = new SearchRequest(esProperties.getBookdbIndex());
    //    searchSourceBuilder.from(from);
    //    searchSourceBuilder.size(pageSize);
    searchSourceBuilder.trackTotalHits(true);
    searchRequest.source(searchSourceBuilder);
    try {
      SearchResponse searchResponse =
          restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
      // 處理搜索結果
      SearchHits hits = searchResponse.getHits();
      List<SearchHit> list = Arrays.asList(hits.getHits());
      // 封裝數據
      if (CollectionUtils.isEmpty(list)) {
        log.warn("開始轉換數據docs為空");
        return Collections.emptyList();
      }
      // 將 docs 集合轉換為一個流,以便進行流式操作
      List<BookDb> datas =
          list.stream()
              .map(hit -> docToModel(hit))
              .collect(Collectors.toList());
      log.info("BookDb, 將es數據轉為BookDb結果:{}", datas);
      return datas;
    } catch (Exception e) {
      log.error("pageQuery searchRequest:{}, error:", searchRequest, e);
    }
    return null;
  }

  public BookDb docToModel(SearchHit searchHit) {
    if (null == searchHit) {
      return null;
    }
    String json = searchHit.getSourceAsString();
    log.info("原始json:{}", json);
    if (StringUtils.isBlank(json)) {
      return null;
    }
    return JSON.parseObject(json, BookDb.class);
  }

  public static BoolQueryBuilder searchCondition(List<String> appIds) {
    if (CollectionUtils.isNotEmpty(appIds)) {
      return QueryBuilders.boolQuery()
          .must(QueryBuilders.idsQuery().addIds(appIds.toArray(new String[] {})));
    }
    return null;
  }
}

2. RestHighLevelClient獲取

2.1 es配置

# es
spring.elastic.host=localhost
spring.elastic.port=9200
spring.elastic.user=elastic
spring.elastic.password=elastic
spring.elastic.bookdbIndex=bookdb

2.2 配置類

package com.niewj.ssdemo.config.es;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "spring.elastic")
@Data
public class EsProperties {
  private String host;
  private String user;
  private String password;
  private int port;
  private String type = "_doc";
  private String index;
  private String bookdbIndex;
}

2.3 獲取client

package com.niewj.ssdemo.config.es;

import javax.annotation.Resource;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableConfigurationProperties(EsProperties.class)
public class EsConfig {
  @Resource private EsProperties esProperties;

  @Bean
  @ConditionalOnMissingBean(RestHighLevelClient.class)
  public RestHighLevelClient restHighLevelClient() {
    return new RestHighLevelClient(
        RestClient.builder(new HttpHost(esProperties.getHost(), esProperties.getPort(), "http"))
            .setHttpClientConfigCallback(
                httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(init())));
  }
  private CredentialsProvider init() {
    CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
    credentialsProvider.setCredentials(
        AuthScope.ANY,
        new UsernamePasswordCredentials(esProperties.getUser(), esProperties.getPassword()));
    return credentialsProvider;
  }
}
user avatar lywlinux 头像
点赞 1 用户, 点赞了这篇动态!
点赞

Add a new 评论

Some HTML is okay.