Spring整合Elasticsearch搜索引擎

Spring整合Elasticsearch搜索引擎

使用

Maven依赖

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-elasticsearch</artifactId>
    <version>4.3.9</version>
</dependency>

配置类

@Configuration
public class EsConfig extends AbstractElasticsearchConfiguration {

    /**
     * 装配RestHighLevelClient客户端
     * @return
     */
    @Override
    public RestHighLevelClient elasticsearchClient() {
        //初始化连接配置
        ClientConfiguration conf =
                ClientConfiguration.create("127.0.0.1:9200");
        //创建客户端并返回
        return RestClients.create(conf).rest();
    }

    /**
     * 装配Elasticsearch的Template,用于操作ES
     * @return
     */
    @Bean
    public ElasticsearchRestTemplate elasticsearchRestTemplate(RestHighLevelClient client) {
        //创建Template并注入RestHighLevelClient
        return new ElasticsearchRestTemplate(client);
    }
}

EsService

@Service
@RequiredArgsConstructor
public class EsService {
    private final ElasticsearchRestTemplate template;

    /**
     * 手动创建索引
     * 根据Class类上的@Ducument注解指定的index来创建索引
     */
    public void createIndex(Class<?> doType) {
        // 判断索引是否创建,如果没有则通过
        if (!template.indexOps(doType).exists()) {
            template.indexOps(doType).create();
        }
    }

    /**
     * 删除索引
     *
     * @param doType
     */
    public void deleteIndex(Class<?> doType) {
        // 判断索引是否创建,如果有则通过
        if (template.indexOps(doType).exists()) {
            template.indexOps(doType).delete();
        }
    }

    /**
     * 判断索引是否创建,如果有则返回true
     * @param doType
     * @return
     */
    public boolean existsIndex(Class<?> doType){
        return template.indexOps(doType).exists();
    }

    /**
     * 创建mapping
     */
    public void createMapping(Class<?> doType) {
        template.indexOps(doType).putMapping();
    }

    /**
     * 创建文档
     *
     * @param doc
     * @param <T>
     */
    public <T> void createDoc(T doc) {
        template.save(doc);
    }

    /**
     * 判断文档是否存在
     *
     * @param id
     * @param indexName
     * @return
     */
    public boolean docExists(String id, String indexName) {
        return template.exists(id, IndexCoordinates.of(indexName));
    }

    /**
     * 根据id查询具体的文档
     *
     * @param id
     * @param docType
     * @param <T>
     * @return
     */
    public <T> T getDocById(String id, Class<T> docType) {
        return template.get(id, docType);
    }

    /**
     * 更新文档
     *
     * @param document
     */
    public void updateDoc(Document document) {
        UpdateQuery query = UpdateQuery.builder(document.getId()).withDocument(document).build();
        template.update(query, IndexCoordinates.of(document.getIndex()));
    }

    /**
     * 根据id删除文档
     *
     * @param id
     * @param docType
     * @return
     */
    public void deleteDoc(String id, Class<?> docType){
        template.delete(id,docType);
    }

    /**
     * 查询所有的文档记录
     * @return
     */
    public <T> List<T> listNames(Class<T> docType){
        NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();
        SearchHits<T> hits = template.search(builder.build(),docType);
        List<T> list = new ArrayList<>();
        hits.forEach(tSearchHit -> list.add(tSearchHit.getContent()));
        return list;
    }

    /**
     * 查询所有的文档记录
     * @return
     */
    public <T> List<T> listNames(Class<T> docType,Integer pageNum,Integer pageSize){
        NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();
        builder.withPageable(PageRequest.of(pageNum,pageSize));
        SearchHits<T> hits = template.search(builder.build(),docType);
        List<T> list = new ArrayList<>();
        hits.forEach(tSearchHit -> list.add(tSearchHit.getContent()));
        return list;
    }

    /**
     * 根据条件查询文档记录
     * @param searchParam 查询参数
     * @param field 检索的字段
     * @param docType 文档的Class对象
     * @param pageNum 分页参数
     * @param pageSize 分页参数
     * @return
     * @param <T>
     */
    public <T> List<T> listNamesByName(String searchParam,String field,Class<T> docType,Integer pageNum,Integer pageSize){
        NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();
        builder.withPageable(PageRequest.of(pageNum,pageSize));

        // term查询
        builder.withQuery(QueryBuilders.termQuery(field,searchParam));
        // match查询
//        builder.withQuery(QueryBuilders.matchQuery(field,searchParam));

        SearchHits<T> hits = template.search(builder.build(),docType);
        List<T> list = new ArrayList<>();
        hits.forEach(tSearchHit -> list.add(tSearchHit.getContent()));
        return list;
    }

    /**
     * 布隆查询
     * @param docType
     * @param searchParam
     * @param fields
     * @return
     * @param <T>
     */
    public <T> List<T> boolSearch(Class<T> docType,String searchParam,String... fields){
        NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        for (String field:fields){
            boolQueryBuilder.should(QueryBuilders.termQuery(field,searchParam));
        }
        builder.withQuery(boolQueryBuilder);
        SearchHits<T> hits = template.search(builder.build(),docType);
        List<T> list = new ArrayList<>();
        hits.forEach(tSearchHit -> list.add(tSearchHit.getContent()));
        return list;
    }

    /**
     * 布隆查询
     * @param docType
     * @param searchParam
     * @param fields
     * @return
     * @param <T>
     */
    public <T> List<T> boolSearch(Class<T> docType,Integer pageNum,Integer pageSize,String searchParam,String... fields){
        NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();
        builder.withPageable(PageRequest.of(pageNum,pageSize));
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        for (String field:fields){
            boolQueryBuilder.should(QueryBuilders.termQuery(field,searchParam));
        }
        builder.withQuery(boolQueryBuilder);
        SearchHits<T> hits = template.search(builder.build(),docType);
        List<T> list = new ArrayList<>();
        hits.forEach(tSearchHit -> list.add(tSearchHit.getContent()));
        return list;
    }
}