springcloud全家桶個人博客系統(五)RestHighLevelClient實現elasticsearch全文檢索及結果高亮

一、前言

上個版本使用springdata elasticsearch,但是也只是支持到了elasticsearch 2點幾的版本,並不適合繼續深入的挖掘。本次使用elasticsearch6.4.2版本,使用RestHighLevelClient客戶端,吐嘈一下,transport客戶端真的噁心,各種莫名其妙的錯誤,什麼堆棧溢出,找不到節點,反正不好用,個人感覺。

二、配置

1.application.properties

#Elasticserch
elasticsearch.port=9200
elasticsearch.ip=127.0.0.1
elasticsearch.connectTimeOut=1000
elasticsearch.socketTimeOut=30000
elasticsearch.connectionRequestTimeOut=500
elasticsearch.maxConnectNum=100
elasticsearch.maxConnectPerRoute=100

注意:9200,不是9300,9200纔是rest的端口

2.ElasticsearchConfig

    private ArrayList<HttpHost> hostList;
    @Value(value = "${elasticsearch.port}")
    private Integer port;
    @Value(value = "${elasticsearch.ip}")
    private String hosts;
    /** 連接超時時間 */
    @Value("${elasticsearch.connectTimeOut}")
    private static int connectTimeOut;
    /** 連接超時時間 */
    @Value("${elasticsearch.socketTimeOut}")
    private static int socketTimeOut;
    /** 獲取連接的超時時間 */
    @Value("${elasticsearch.connectionRequestTimeOut}")
    private int connectionRequestTimeOut;
    /** 最大連接數 */
    @Value("${elasticsearch.maxConnectNum}")
    private int maxConnectNum;
    /** 最大路由連接數 */
    @Value("${elasticsearch.maxConnectPerRoute}")
    private int maxConnectPerRoute;

    @PostConstruct
    public void init() {
        hostList = new ArrayList<>();
        String[] hostStrs = hosts.split(",");
        for (String host : hostStrs) {
            // 使用的協議
            String schema = "http";
            hostList.add(new HttpHost(host, port, schema));
        }
    }

    @Bean
    public RestHighLevelClient client() {
        RestClientBuilder builder = RestClient.builder(hostList.toArray(new HttpHost[0]));
        // 異步httpclient連接延時配置
        builder.setRequestConfigCallback(requestConfigBuilder -> {
            requestConfigBuilder.setConnectTimeout(connectTimeOut);
            requestConfigBuilder.setSocketTimeout(socketTimeOut);
            requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeOut);
            return requestConfigBuilder;
        });
        // 異步httpclient連接數配置
        builder.setHttpClientConfigCallback(httpClientBuilder -> {
            httpClientBuilder.setMaxConnTotal(maxConnectNum);
            httpClientBuilder.setMaxConnPerRoute(maxConnectPerRoute);
            return httpClientBuilder;
        });
        return new RestHighLevelClient(builder);
    }

注意:PostConstruct設置該方法爲init方法 

三、es操作工具類

  private final RestHighLevelClient restHighLevelClient;
    private static final String ES_TYPE = "article";
    private static final String ES_INDEX = "article";

    @Autowired
    public EsUtil(RestHighLevelClient restHighLevelClient) {
        this.restHighLevelClient = restHighLevelClient;
    }


    @PostConstruct
    public void init() throws IOException {
        if (!existsIndex()) {
            CreateIndexRequest request = new CreateIndexRequest("article");
            CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(request,RequestOptions.DEFAULT);
            log.info("createIndex: " + JSON.toJSONString(createIndexResponse));

        }
    }

    private boolean existsIndex() throws IOException {
        GetIndexRequest request = new GetIndexRequest();
        request.indices("article");
        boolean exists = restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT);
        log.info("existsIndex: " + exists);
        return exists;
    }

    public void addData(Blog blog, String id) throws IOException {
        IndexRequest indexRequest = new IndexRequest(ES_INDEX, ES_TYPE, id);
        indexRequest.source(JSONObject.toJSONString(blog), XContentType.JSON);
        IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
        System.out.println("add: " + JSON.toJSONString(indexResponse));
    }

    public void updateDataById(Blog blog, String id) throws IOException {
        UpdateRequest request = new UpdateRequest(ES_INDEX, ES_TYPE, id);
        request.doc(JSONObject.toJSONString(blog), XContentType.JSON);
        UpdateResponse updateResponse = restHighLevelClient.update(request, RequestOptions.DEFAULT);
        log.info("update: " + JSON.toJSONString(updateResponse));
    }

    public void deleteDataById(String id) throws IOException {
        DeleteRequest request = new DeleteRequest(ES_INDEX, ES_TYPE, id);
        DeleteResponse deleteResponse = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
        log.info("delete: "+JSON.toJSONString(deleteResponse));
    }

    public List<Blog> searchDataPage(int startRow, int size, BoolQueryBuilder queryBuilder) throws IOException {
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(queryBuilder);
        sourceBuilder.from(startRow);
        // 獲取記錄數,默認10
        sourceBuilder.size(size);

        //設置高亮顯示
        HighlightBuilder highlightBuilder = new HighlightBuilder().field("*").requireFieldMatch(false);
        highlightBuilder.preTags("<span style=\"color:red\">");
        highlightBuilder.postTags("</span>");
        sourceBuilder.highlighter(highlightBuilder);

        SearchRequest searchRequest = new SearchRequest(ES_INDEX);
        searchRequest.types(ES_TYPE);
        searchRequest.source(sourceBuilder);
        SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        //遍歷結果
        for(SearchHit hit : response.getHits()){
            Map<String, Object> source = hit.getSourceAsMap();
            //處理高亮片段
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            HighlightField nameField = highlightFields.get("title");
            if(nameField!=null){
                Text[] fragments = nameField.fragments();
                StringBuilder nameTmp = new StringBuilder();
                for(Text text:fragments){
                    nameTmp.append(text);
                }
                //將高亮片段組裝到結果中去
                source.put("title", nameTmp.toString());
                log.info(source.toString());
            }
        }
        SearchHits hits = response.getHits();
        SearchHit[] searchHits = hits.getHits();
        List<Blog> blogList = new ArrayList<>();
        for (SearchHit hit : searchHits) {
            JSONObject jsonObject = new JSONObject(hit.getSourceAsMap());
            log.info("search:{}", jsonObject.toJSONString());
            blogList.add(JSONObject.toJavaObject(jsonObject, Blog.class));
        }
        return blogList;
    }

四、效果

可以看見title已經有高亮的語法了。

五、github地址

https://github.com/sustly/blog_vue_server

注意:master分支纔是springcloud版本

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章