Es客户端启动以及各种条件查询增删改查

132 阅读3分钟

package org.jky.masterdata.app.Utils;

import co.elastic.clients.elasticsearch.ElasticsearchClient; import co.elastic.clients.elasticsearch.core.*; import co.elastic.clients.elasticsearch.core.search.Highlight; import co.elastic.clients.elasticsearch.core.search.Hit; import co.elastic.clients.elasticsearch.indices.AnalyzeRequest; import co.elastic.clients.elasticsearch.indices.AnalyzeResponse; import co.elastic.clients.elasticsearch.indices.GetIndexRequest; import co.elastic.clients.elasticsearch.indices.GetIndexResponse; import co.elastic.clients.elasticsearch.indices.analyze.AnalyzeToken; import co.elastic.clients.json.jackson.JacksonJsonpMapper; import co.elastic.clients.transport.ElasticsearchTransport; import co.elastic.clients.transport.rest_client.RestClientTransport; import co.elastic.clients.elasticsearch.core.SearchRequest; import co.elastic.clients.elasticsearch.core.SearchResponse; import co.elastic.clients.util.ObjectBuilder; import co.elastic.clients.elasticsearch.core.search.HighlightField.Builder; import com.fasterxml.jackson.databind.JsonNode; import org.apache.http.HttpHost; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.CredentialsProvider; import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.impl.nio.client.HttpAsyncClientBuilder; import org.apache.http.ssl.SSLContextBuilder; import org.apache.http.ssl.SSLContexts; import org.elasticsearch.common.io.stream.InputStreamStreamInput; import org.elasticsearch.index.query.SearchExecutionContext; import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; import org.elasticsearch.search.fetch.subphase.highlight.HighlightField; import org.jky.common.core.PageData; import org.jky.common.utils.SpringContextUtils; import org.jky.masterdata.domain.model.DataManage; import com.alibaba.fastjson2.JSONObject;

import org.elasticsearch.action.search.SearchType; import org.elasticsearch.index.query.QueryBuilders.; import javax.net.ssl.SSLContext; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.security.KeyStore; import java.security.cert.Certificate; import java.security.cert.CertificateFactory; import java.util.; import java.util.function.Function;

/**

  • @Author: gengxinxiu

  • @Date: 2024/4/7 15:02

  • @Description: **/ public class EsClient { //同步操作客户端 private static ElasticsearchClient client; // //异步操作客户端 // private static ElasticsearchAsyncClient asyncClient; //关闭客户端 private static ElasticsearchTransport transport; private static Highlight build;

    public static void main(String[] args) throws Exception { initEsConnection(); // queryDoc("1798967909888819200"); // deleteDoc(123); // findAnalyzer(""); // queryDocById("1800708242217631744"); // queryByCondition(0,3,"总则"); transport.close();

    }

    public static PageData queryByCondition(int offset,int pageSize,String value,List dictIds){ SearchRequest request = SearchRequest.of(b -> b .index("dev_test_index").size(1000)// 因为搜索默认是分页的 所以查询的文档最多调成1000 .query(q -> q .bool(bq -> bq .should( m -> m.nested(n -> n .path("sections.items") .query(nq -> nq .bool(nbq -> nbq .should(sq -> sq.match(mtq -> mtq .field("sections.items.content") .query(value) )) .should(sq -> sq.match(mtq -> mtq .field("sections.items.title") .query(value).analyzer("ik_smart") )) .minimumShouldMatch("1")

                                                             )
                                                     )
                                             )
                                     )
                                     .should(mq -> mq.match(mtq -> mtq
                                             .field("title")
                                             .query(value)
                                     ))
                                     .should(
                                             m -> m.nested(n -> n
                                                     .path("sections")
                                                     .query(nq -> nq
                                                             .bool(nbq -> nbq
                                                                     .should(sq -> sq.match(mtq -> mtq
                                                                             .field("sections.content")
                                                                             .query(value)
                                                                     ))
                                                                     .should(sq -> sq.match(mtq -> mtq
                                                                             .field("sections.title")
                                                                             .query(value)
                                                                     ))
                                                                     .minimumShouldMatch("1")
    
                                                             )
                                                     )
                                             )
                                     )
                             )
                     )
                     .highlight(h -> h
                             .fields("sections.items.content", f -> f
                                     .preTags("<span style='color:#F00'>")
                                     .postTags("</span>")
                             ) .fields("sections.content", f -> f
                                     .preTags("<span style='color:#F00'>")
                                     .postTags("</span>")
                             ) .fields("sections.title", f -> f
                                     .preTags("<span style='color:#F00'>")
                                     .postTags("</span>")
                             ) .fields("sections.items.title", f -> f
                                     .preTags("<span style='color:#F00'>")
                                     .postTags("</span>")
                             ) .fields("title", f -> f
                                     .preTags("<span style='color:#F00'>")
                                     .postTags("</span>")
                             ).fields("sections", f -> f
                                     .preTags("<span style='color:#F00'>")
                                     .postTags("</span>")
                             )
                     )
     );
             // 你可以在这里添加排序、分页等选项
    
     SearchResponse searchResponse = null;
    
    
     try {
         PageData<Object> page = new PageData<>();
         ArrayList<Object> list = new ArrayList<>();
         searchResponse = client.search(request, JSONObject.class);
         List<Hit<Object>> hits = searchResponse.hits().hits();
         int total=0;
         List<String> fieldNames =Arrays.asList("sections.items.content","sections.content","sections.title","sections.items.title","title");
         for (Hit<Object> hit : hits) {
             HashMap<String, Object> map = new HashMap<>();
             map.put("id",hit.id());
             DataManage data = new DataManage().findCreateTimeById(Long.parseLong(hit.id()));
             if(null!=data){
                 map.put("date",data.getFileDate());
                 map.put("dictId",data.getDictId());
                 map.put("filePath",data.getFilePath());
             }
    

; Map dataMap = new ObjectMapper().convertValue(hit.source(), Map.class); String content=""; for (String fieldName : fieldNames) { if( null!=hit.highlight().get(fieldName) && !hit.highlight().get(fieldName).isEmpty()){ for (String s : hit.highlight().get(fieldName)) { content=content+s; map.put("content",content); } } } map.put("title",dataMap.get("title")) ; if(null!=dictIds && !dictIds.isEmpty()){ for (String dictId : dictIds) { if(dictId.equals(data.getDictId().toString())){ total++; list.add(map); } }

            }

        }
        if (offset < list.size()) {
            int endIndex = Math.min(offset + pageSize, list.size());
            page.setRows(list.subList(offset, endIndex));
            // 或者使用 Collections.emptyList()
        }else{
            page.setRows(list);
        }
        page.setTotal(total);
     //   page.setTotal(searchResponse.hits().total().value());
        return page;
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

public static  List<String> findAnalyzer(String value){

        // 发送请求并获取响应
        try {
            // 创建AnalyzeRequest
            AnalyzeRequest request = AnalyzeRequest.of(b -> b
                    .analyzer("ik_max_word")
                    .text(value));

            List<String> words = new ArrayList<>();
            AnalyzeResponse response = client.indices().analyze(request);
            // 处理响应
            for (AnalyzeToken token : response.tokens()) {
                words.add(token.token());
            }
            return words;
        } catch (IOException e) {
            throw new RuntimeException(e);
        }


}

//查看
public static Object queryDocById(String id)throws Exception{
    SearchResponse<Object> response = client.search(s -> s
                    .index("dev_test_index")
                    .query(q -> q.term(t -> t.field("_id").value(id))),
            Object.class);
            List<Hit<Object>> hits = response.hits().hits();

// 解析数据 Object source=null; for (Hit hit : hits) { source = hit.source(); System.out.println("查询结果为:"+source); } return source;

// final SearchRequest.Builder searchRequestBuilder = new SearchRequest.Builder().index("my_comment_index"); // MatchQuery matchQuery = new MatchQuery.Builder().field("name").query(FieldValue.of("zhangsan")).build(); // Query query = new Query.Builder().match(matchQuery).build(); // searchRequestBuilder.query(query); // SearchRequest searchRequest = searchRequestBuilder.build(); // final SearchResponse search = client.search(searchRequest, Object.class); // System.out.println(search); // //关闭连接 }

//删除
public static void deleteDoc(Long id)throws Exception{
    // 删除文档
    DeleteRequest deleteRequest = new DeleteRequest.Builder().index("dev_test_index").id(id.toString()).build();
    DeleteResponse deleteResponse = client.delete(deleteRequest);
    System.out.println("删除操作"+deleteResponse);
    //关闭连接
    transport.close();
}
public static String createDoc(JSONObject jsonObject)throws Exception{
    String id = SpringContextUtils.getSnowflakeGenerator().next().toString();
    IndexRequest indexRequest = new IndexRequest.Builder<>()
            .index("dev_test_index")
            .id(id)
            .document(jsonObject)
            .build();
    final IndexResponse index = client.index(indexRequest);
    System.out.println("文档操作结果:" + index.result());
    //关闭连接
    transport.close();
    return id;
}

public static void initEsConnection() throws Exception {
    // 获取客户端对象
    final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
    // 注意这里改成自己的账号密码
    credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elastic", "gtQz2RpxM7NonqBqf5_x"));
    //Path caCertificatePath = Paths.get("D:\\devlop\\jdk17\\lib\\security\\http_ca.crt");
     Path caCertificatePath = Paths.get("/home/code/budget-knowledge-db/cart/http_ca.crt");
    CertificateFactory factory = CertificateFactory.getInstance("X.509");
    Certificate trustedCa;
    try (InputStream is = Files.newInputStream(caCertificatePath)) {
        trustedCa = factory.generateCertificate(is);
    }
    KeyStore trustStore = KeyStore.getInstance("pkcs12");
    trustStore.load(null, null);
    trustStore.setCertificateEntry("ca", trustedCa);
    SSLContextBuilder sslContextBuilder = SSLContexts.custom().loadTrustMaterial(trustStore, null);
    final SSLContext sslContext = sslContextBuilder.build();
    // 主机名改成自己的
    RestClientBuilder builder = RestClient.builder(
                    new HttpHost("210.79.226.155", 9200, "https"))
            .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                @Override
                public HttpAsyncClientBuilder customizeHttpClient(
                        HttpAsyncClientBuilder httpClientBuilder) {
                    return httpClientBuilder.setSSLContext(sslContext)
                            .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
                            .setDefaultCredentialsProvider(credentialsProvider);
                }
            });
    RestClient restClient = builder.build();
    transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
    // 将新创建的ElasticsearchClient实例赋值给类级别的静态变量client
    client = new ElasticsearchClient(transport);
    // 异步

// ElasticsearchAsyncClient asyncClient = new ElasticsearchAsyncClient(transport); //查询索引 GetIndexRequest getIndexRequest = new GetIndexRequest.Builder().index("dev_test_index").build(); final GetIndexResponse getIndexResponse = client.indices().get(getIndexRequest); System.out.println( "索引查询成功: :" + getIndexResponse.result()); // IndexRequest.Builder index = new IndexRequest.Builder<>().index("my_index");

}

}