传统的Elasticsearch6.x以下的版本在一些内网开发的企业,可能多数不会去使用到,用到比较多的话大都是7.x版本的,我在这里使用到的是Elasticsearch7.8版本,因为安全性高,使用7.8需要提供到用户名和密码
1.首先要在yml配置好相应参数
elasticsearch:
rest:
host: x.x.x.x
port: 9200
username: xxxxxx
password: xxxxxx
2.创建好之后就可以去写一个配置类去集成AbstractElasticsearchConfiguration类(Spring Data Elasticsearch 提供的一个基础配置类,用于配置 Elasticsearch 相关的一些参数和设置)
,然后在配置类里面去实现
@Configuration
public class ElasticsearchConfig extends AbstractElasticsearchConfiguration {
private static final Logger logger = LoggerFactory.getLogger(ElasticsearchConfig.class);
@Value("${jeecg.elasticsearch.rest.host}")
private String host;
@Value("${jeecg.elasticsearch.rest.port}")
private int port;
@Value("${jeecg.elasticsearch.rest.username}")
private String username;
@Value("${jeecg.elasticsearch.rest.password}")
private String password;
@Bean
//这是 Elasticsearch 官方 Java 客户端的高级 REST 客户端
public RestHighLevelClient elasticsearchClient() {
logger.info("Elasticsearch Host: {}", host);
logger.info("Elasticsearch Port: {}", port);
logger.info("Elasticsearch Username: {}", username);
logger.info("Elasticsearch Password: {}", password);
//AuthScope.ANY 表示这些凭证将适用于任何主机和端口
BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
RestClientBuilder builder = RestClient.builder(new HttpHost(host, port, "http"))
.setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider));
return new RestHighLevelClient(builder);
}
@Bean
//这是 Spring Data Elasticsearch 提供的一个高级模板,用于与 Elasticsearch 进行交互
public ElasticsearchRestTemplate elasticsearchTemplate() {
return new ElasticsearchRestTemplate(elasticsearchClient());
}
@Bean
//创建了一个 MappingElasticsearchConverter 实例,用于在 Elasticsearch 文档和 Java 实体类之间执行映射转换。这个转换器依赖于上面创建的 Elasticsearch 映射上下文
public MappingElasticsearchConverter elasticsearchConverter() {
return new MappingElasticsearchConverter(elasticsearchMappingContext());
}
}
3.我们构建好几本的ES客户端后,在添加完数据后,就可以去实现搜索功能了
@Service
@Slf4j
public class IDisciplineWorkESServiceImpl implements IDisciplineWorkESService {
@Autowired
private ElasticsearchOperations template;
@Override
public List<DisciplineWorkESDTO> search(String title) {
// 创建一个NativeSearchQueryBuilder,用于构建Elasticsearch查询
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
if (title != null) {
//构建多字段查询条件
BoolQueryBuilder should = QueryBuilders.boolQuery()
.should(QueryBuilders.queryStringQuery(title).field("articleTitle"))
.should(QueryBuilders.queryStringQuery(title).field("content"))
.should(QueryBuilders.queryStringQuery(title).field("authorName"));
nativeSearchQueryBuilder.withQuery(should);
// 设置分页,这里设置为第一页,每页10条
nativeSearchQueryBuilder.withPageable(PageRequest.of(0, 10));
// 创建NativeSearchQuery
NativeSearchQuery query = nativeSearchQueryBuilder.build();
String s = query.getQuery().toString();
System.out.println(s);
// 执行查询
SearchHits<DisciplineWorkESDTO> searchHits = template.search(query, DisciplineWorkESDTO.class);
// 获取结果数据并返回
return searchHits.getSearchHits().stream()
.map(searchHit -> searchHit.getContent())
.collect(Collectors.toList());
}
return null;
}
}
在上面的过程中,可能会遇到一些问题
使用RestHighLevelClient创建客户端的时候,不要使用以下方法,会出现一个报错,就是出现要求你关闭ES客户端的问题,有数据泄露的风险
@Bean
public RestHighLevelClient elasticsearchClient() {
ClientConfiguration clientConfiguration = ClientConfiguration.builder()
.connectedTo(host + ":" + port)
.withBasicAuth(username, password)
.build();
return RestClients.create(clientConfiguration).rest();
}