springboot整合es

springboot整合es

环境准备

jdk 1.8
springboot 2.x
elasticsearch-6.7.0 (官网下载)

导入依赖

     <!--ElasticSearch依赖-->
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>6.7.0</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>6.7.0</version>
        </dependency>`

es版本用的是6.7.0,用restHighLevelClient来操作的

配置


@Configuration
@Slf4j
public class ESConfig {

    /**
     * 主机,本机ip
     */
    @Value("${elasticsearch.host}")
    private String esHost;

    /**
     * 传输层端口,一般是9200,可以去elasticsearch.yml改
     */
    @Value("${elasticsearch.port}")
    private int esPort;

    /**
     * 集群名称,一般是my-application,可以去elasticsearch.yml改
     */
    @Value("${elasticsearch.clustername}")
    private String esClusterName;

    @Bean
    public RestHighLevelClient restHighLevelClient() {
        log.info("开始初始化Elasticsearch");
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost(esHost, esPort,"http")));
        return restHighLevelClient;
    }
}

一些相关操作

    @Resource
    private RestHighLevelClient restHighLevelClient;

1.条件查询

        //一般查询用BoolQueryBuilder 就够了
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        //must;should;mustNot
        //termQuery 是完全匹配;还有matchQuery分词查询;matchAllQuery查询全部;还有模糊查询等等
        //查询指定userId,未逻辑删除的数据
        boolQuery.must(QueryBuilders.termQuery("userId", userId));
        boolQuery.mustNot(QueryBuilders.termQuery("isDelete", "0"));
        //一个查询请求体,将query放入
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(query);
        searchSourceBuilder.from(0);//分页 (pageNum-1)*pageSize
        searchSourceBuilder.size(10);//分页 pageSize
        searchSourceBuilder.sort("createTime", SortOrder.DESC);//排序
        //一个查询请求,将请求体放入
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices(index);//es上索引名,要自己建
        searchRequest.types(type);//类型名
        searchRequest.source(searchSourceBuilder);
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT)// 解析对象
        List<XXXVO> voList = new ArrayList<>();
        if (SUCCESS == searchResponse.status().getStatus()) {
            for (SearchHit searchHit : searchResponse.getHits().getHits()) {
                XXXVO xxxVO = JSON.parseObject(searchHit.getSourceAsString(), XXXVO.class);
                voList.add(xxxVO);
            }
        }

2.批量操作

删除不知道为什么用deleteByQuery一直出错,所以我是手动先查询然后再批量删除

        //批量操作的请求
        BulkRequest request = new BulkRequest();
        //这是查询要删的数据
        SearchResponse searchResponse = searchData(index,type,query,sortName,0,0);
        if (SUCCESS == searchResponse.status().getStatus()) {
            // 解析对象
            SearchHit[] resultHit =  searchResponse.getHits().getHits();
            if(resultHit.length > 0){
                for (SearchHit searchHit : searchResponse.getHits().getHits()) {
                    //searchHit.getId()拿到每条数据的id然后新建删除请求,放入批量请求里面
                    request.add(new DeleteRequest(index,type,searchHit.getId()));
                }
                //执行批量请求
               restHighLevelClient.bulk(request, RequestOptions.DEFAULT);;
            }
        }

3.搜索推荐

一般有用户输入某个词然后会查询是否有相关推荐词

        //比如我输入二次元,然后去某个索引下某个字段去搜索是否有相关词语来推荐
        //title字段
        CompletionSuggestionBuilder completionSuggestionBuilder = new CompletionSuggestionBuilder("title");
        //前缀匹配,可能会搜出"二次元*****"
        completionSuggestionBuilder.prefix("二次元");
        //这里的mySuggestion可以随意取值,但是拿到SearchResponse后是根据这个值来解析相应的推荐结果
        //可以加多个推荐,在后面继续addSuggestion就行了
        SuggestBuilder suggestBuilder = new SuggestBuilder().addSuggestion("mySuggestion", completionSuggestionBuilder);
        //查询请求
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.suggest(suggest);
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices(index);//索引名
        searchRequest.types(type);//类型名
        searchRequest.source(searchSourceBuilder);
        //结果
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
         List<String> resultList = new ArrayList<>();//将推荐结果保存到list
        if (SUCCESS == suggestResponse.status().getStatus()) {
                Suggest suggest = suggestResponse.getSuggest();
                if (suggest != null) {
                    Suggest.Suggestion suggestion = suggest.getSuggestion("mySuggestion");
                    List<Suggest.Suggestion.Entry> entry = suggestion.getEntries();
                    List<Suggest.Suggestion.Entry.Option> optionList = entry.get(0).getOptions();
                    for (Suggest.Suggestion.Entry.Option option : optionList) {
                        resultList.add(option.getText().toString());
                    }
                }
            }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值