elasticsearch-sql icon indicating copy to clipboard operation
elasticsearch-sql copied to clipboard

transportclient可以切换成resthighlevelclient吗?

Open kinbod opened this issue 3 years ago • 18 comments

transportclient可以切换成resthighlevelclient吗?

kinbod avatar May 07 '21 07:05 kinbod

请问,目前的使用方式是? 1、未安装插件,直接引用jar包,使用SearchDao 2、未安装插件,使用jdbc 3、已安装插件,使用rest api

shi-yuan avatar May 07 '21 07:05 shi-yuan

@shi-yuan 网络环境限制长连接只能保持4min,现在项目查询等操作都是走es-sql,插入已经修改为JestClient.

(目前es版本5.5.6 ,es-sql 5.5.1 并且不能做升级)

目前可以用什么方案解决长连接断开后,es-sql查询不到ES数据的问题,还请指导一下: 1、修改为 SearchDao 来做查询操作 2、修改成JDBC的方式,保障长连接断开后及时重连

cccccccAi avatar May 11 '21 08:05 cccccccAi

1、如果是httpclient,可以借助keep-alive和HttpRequestRetryHandler

2、如果是TransportClient,定时器默认每隔5秒,调度NodeSampler(根据配置client.transport.sniff确定实例化SniffNodesSampler还是SimpleNodeSampler)的sample方法,方法内部会同node建立连接

shi-yuan avatar May 31 '21 12:05 shi-yuan

所以能和highlevel一起用吗?

zwwlyvv avatar Nov 24 '21 07:11 zwwlyvv

@shi-yuan 3、已安装插件,使用rest api

zwwlyvv avatar Nov 24 '21 07:11 zwwlyvv

这种方式问题不大。 如果是未安装插件,纯粹只在客户端使用rest api,目前是不支持的

@shi-yuan 3、已安装插件,使用rest api

shi-yuan avatar Nov 29 '21 08:11 shi-yuan

这种方式有例子吗?

zwwlyvv avatar Nov 30 '21 05:11 zwwlyvv

POST _nlpcn/sql
{
    "sql":"select * from myindex"
}
POST _nlpcn/sql/explain
{
    "sql":"select * from myindex"
}

shi-yuan avatar Nov 30 '21 09:11 shi-yuan

@shi-yuan 我指的是resthighlevelclient,通过java来对es进行查询,我看过用了elasticsearch-sql插件的例子里面使用的客户端是transportclient客户端,现在想把transportclient更改成resthighlevel客户端,不知道可不可以这样改。版本6.1.4

zwwlyvv avatar Dec 01 '21 01:12 zwwlyvv

目前不支持直接替换的哈

shi-yuan avatar Dec 01 '21 05:12 shi-yuan

目前不支持直接替换的哈

@shi-yuan 嗨喽,万分感谢回复,我用这种方法实现了,借助一个空的TransportClient完成SQL的请求构建,然后将请求转换成RestHighLevelClient的请求,最后得到response。

zwwlyvv avatar Dec 02 '21 02:12 zwwlyvv

也可以,不过某些转换是不支持的。

其实可以不用构建空的,直接传null,进去就行

SearchDao searchDao = new SearchDao(null);
String dsl = searchDao.explain("SELECT * FROM myindex").explain().explain();
System.out.println(dsl);

shi-yuan avatar Dec 02 '21 03:12 shi-yuan

目前不支持直接替换的哈

@shi-yuan 嗨喽,万分感谢回复,我用这种方法实现了,借助一个空的TransportClient完成SQL的请求构建,然后将请求转换成RestHighLevelClient的请求,最后得到response。

兄弟,我目前也遇到这个问题了,能否发一段你这里的处理方式代码参考一下,感谢

LiuFuyuan avatar Nov 09 '22 10:11 LiuFuyuan

目前不支持直接替换的哈

@shi-yuan 嗨喽,万分感谢回复,我用这种方法实现了,借助一个空的TransportClient完成SQL的请求构建,然后将请求转换成RestHighLevelClient的请求,最后得到response。

兄弟,我目前也遇到这个问题了,能否发一段你这里的处理方式代码参考一下,感谢

SearchDao searchDao = new SearchDao(null);
String dsl = searchDao.explain("SELECT * FROM myindex").explain().explain();
System.out.println(dsl);

SearchSourceBuilder sourceBuilder;
try (XContentParser parser = JsonXContent.jsonXContent.createParser(NamedXContentRegistry.EMPTY, LoggingDeprecationHandler.INSTANCE, dsl)) {
    sourceBuilder = SearchSourceBuilder.fromXContent(parser);
}

SearchRequest request = new SearchRequest();
request.source(sourceBuilder);

shi-yuan avatar Nov 30 '22 13:11 shi-yuan

最新版8.5.3使用的elasticsearch-java客户端,以http的方式,9200端口

public static void main(String[] args) throws Exception {
    SearchDao searchDao = new SearchDao(createElasticsearchClient());
    ActionResponse response = searchDao.explain("SELECT * FROM myindex").explain().get();
    System.out.println(response);
}

private static Client createElasticsearchClient() throws Exception {
    return new ElasticsearchRestClient(new ElasticsearchClient(getElasticsearchTransport(getRestClient())));
}

private static RestClient getRestClient() throws Exception {
    InetSocketAddress address = getTransportAddress().address();
    String hostPort = String.format("http://%s:%s", address.getHostString(), address.getPort());

    RestClientBuilder builder = RestClient.builder(HttpHost.create(hostPort));
    builder.setHttpClientConfigCallback(clientBuilder -> {
        RequestConfig.Builder requestConfigBuilder = RequestConfig.custom();
        requestConfigBuilder.setConnectTimeout(10 * 1000);

        int socketTimeout = 90 * 1000;
        requestConfigBuilder.setSocketTimeout(socketTimeout);
        requestConfigBuilder.setConnectionRequestTimeout(socketTimeout);
        clientBuilder.setDefaultRequestConfig(requestConfigBuilder.build());

        return clientBuilder;
    });
    return builder.build();
}

private static TransportAddress getTransportAddress() throws Exception {
    String host = System.getenv("ES_TEST_HOST");
    String port = System.getenv("ES_TEST_PORT");

    if (host == null) {
        host = "localhost";
        System.out.println("ES_TEST_HOST enviroment variable does not exist. choose default 'localhost'");
    }

    if (port == null) {
        port = "9200";
        System.out.println("ES_TEST_PORT enviroment variable does not exist. choose default '9200'");
    }

    System.out.println(String.format("Connection details: host: %s. port:%s.", host, port));
    return new TransportAddress(InetAddress.getByName(host), Integer.parseInt(port));
}

private static ElasticsearchTransport getElasticsearchTransport(RestClient restClient) {
    TransportOptions.Builder transportOptionsBuilder = new RestClientOptions(RequestOptions.DEFAULT).toBuilder();

    ContentType jsonContentType = Version.VERSION == null ? ContentType.APPLICATION_JSON
            : ContentType.create("application/vnd.elasticsearch+json",
            new BasicNameValuePair("compatible-with", String.valueOf(Version.VERSION.major())));

    Consumer<String> setHeaderIfNotPresent = header -> {
        if (transportOptionsBuilder.build().headers().stream().noneMatch((h) -> h.getKey().equalsIgnoreCase(header))) {
            transportOptionsBuilder.addHeader(header, jsonContentType.toString());
        }
    };

    setHeaderIfNotPresent.accept("Content-Type");
    setHeaderIfNotPresent.accept("Accept");

    TransportOptions transportOptionsWithHeader = transportOptionsBuilder.build();
    return new RestClientTransport(restClient, new JacksonJsonpMapper(), transportOptionsWithHeader);
}

shi-yuan avatar Dec 25 '22 15:12 shi-yuan

目前不支持直接替换的哈

@shi-yuan 嗨喽,万分感谢回复,我用这种方法实现了,借助一个空的TransportClient完成SQL的请求构建,然后将请求转换成RestHighLevelClient的请求,最后得到response。

兄弟,我目前也遇到这个问题了,能否发一段你这里的处理方式代码参考一下,感谢

SearchDao searchDao = new SearchDao(null);
String dsl = searchDao.explain("SELECT * FROM myindex").explain().explain();
System.out.println(dsl);

SearchSourceBuilder sourceBuilder;
try (XContentParser parser = JsonXContent.jsonXContent.createParser(NamedXContentRegistry.EMPTY, LoggingDeprecationHandler.INSTANCE, dsl)) {
    sourceBuilder = SearchSourceBuilder.fromXContent(parser);
}

SearchRequest request = new SearchRequest();
request.source(sourceBuilder);

"{"from":0,"size":10,"query":{"bool":{"filter":[{"bool":{"must":[{"nested":{"query":{"bool":{"must":[{"wildcard":{"productList.productName":{"wildcard":"香奈*","boost":1.0}}}],"adjust_pure_negative":true,"boost":1.0}},"path":"productList","ignore_unmapped":false,"score_mode":"none","boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}}}"

这段dsl解析错误 请问什么原因

lizhaowh avatar Apr 18 '23 05:04 lizhaowh

目前不支持直接替换的哈

@shi-yuan 嗨喽,万分感谢回复,我用这种方法实现了,借助一个空的TransportClient完成SQL的请求构建,然后将请求转换成RestHighLevelClient的请求,最后得到response。

兄弟,我目前也遇到这个问题了,能否发一段你这里的处理方式代码参考一下,感谢

SearchDao searchDao = new SearchDao(null);
String dsl = searchDao.explain("SELECT * FROM myindex").explain().explain();
System.out.println(dsl);

SearchSourceBuilder sourceBuilder;
try (XContentParser parser = JsonXContent.jsonXContent.createParser(NamedXContentRegistry.EMPTY, LoggingDeprecationHandler.INSTANCE, dsl)) {
    sourceBuilder = SearchSourceBuilder.fromXContent(parser);
}

SearchRequest request = new SearchRequest();
request.source(sourceBuilder);

"{"from":0,"size":10,"query":{"bool":{"filter":[{"bool":{"must":[{"nested":{"query":{"bool":{"must":[{"wildcard":{"productList.productName":{"wildcard":"香奈*","boost":1.0}}}],"adjust_pure_negative":true,"boost":1.0}},"path":"productList","ignore_unmapped":false,"score_mode":"none","boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}}}"

这段dsl解析错误 请问什么原因

需要注册相关QueryBuilder:

...
SearchSourceBuilder sourceBuilder;
try (XContentParser parser = JsonXContent.jsonXContent.createParser(new NamedXContentRegistry(new SearchModule(Settings.EMPTY, false, Collections.emptyList()).getNamedXContents()), LoggingDeprecationHandler.INSTANCE, dsl)) {
    sourceBuilder = SearchSourceBuilder.fromXContent(parser);
}
...

shi-yuan avatar Apr 22 '23 01:04 shi-yuan

目前不支持直接替换的哈

@shi-yuan 嗨喽,万分感谢回复,我用这种方法实现了,借助一个空的TransportClient完成SQL的请求构建,然后将请求转换成RestHighLevelClient的请求,最后得到response。

兄弟,我目前也遇到这个问题了,能否发一段你这里的处理方式代码参考一下,感谢

SearchDao searchDao = new SearchDao(null);
String dsl = searchDao.explain("SELECT * FROM myindex").explain().explain();
System.out.println(dsl);

SearchSourceBuilder sourceBuilder;
try (XContentParser parser = JsonXContent.jsonXContent.createParser(NamedXContentRegistry.EMPTY, LoggingDeprecationHandler.INSTANCE, dsl)) {
    sourceBuilder = SearchSourceBuilder.fromXContent(parser);
}

SearchRequest request = new SearchRequest();
request.source(sourceBuilder);

非常感谢,现在才看见回复 String dsl = searchDao.explain("SELECT * FROM myindex").explain().explain(); 受你之前这段代码的启发,我这边最终需要得到的是SearchResponse对象,ES是7.7的版本,经过查看本项目源码之后,做了一个强转,改造如下,给其他有需要的同学一个参考: ActionRequest request = search.explain(query).explain().request(); SearchRequest searchRequest = (SearchRequest) request; SearchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

LiuFuyuan avatar May 09 '23 07:05 LiuFuyuan