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");
}
}