elasticsearch 원본 분석 - 클라이언트
18001 단어 elasticsearch
URL
1、 index[ , ,elasticsearch mappings ]
indexName:test
type:document
properties:
curl -X PUT "localhost:9200/test" -H 'Content-Type: application/json' -d'
{
"settings" : {
"number_of_shards" : 1
},
"mappings" : {
"document" : {
"properties" : {
"user" : { "type" : "text" },
"post_date" : { "type" : "text" },
"message" : { "type" : "text" }
}
}
}
}'
2、
_id, post
curl -X POST "localhost:9200/test/document" -H 'Content-Type: application/json' -d'
{
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}'
_id put ,_id 1
curl -X PUT "localhost:9200/test/document/1" -H 'Content-Type: application/json' -d'
{
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}'
3、 index
curl -X DELETE "localhost:9200/twitter"
4、 , 。
curl -X POST "localhost:9200/_search" -H 'Content-Type: application/json' -d'
{
"query" : {
"match_all" : {}
}
}'
Elasticsearch 참조 5.x 소스 분석 (2) TransportClient 및 RestClient
RestClient 9200
후속 버전에서 Rest High Level Client를 제공했는데 json 데이터를 포장한 것입니다.request에는 builder 포장이 많습니다.response는 대응하는 response로 포장되었습니다.하지만 모든 요청을 포장한 것은 아니다.mavenpom 파일
<dependencies>
<dependency>
<groupId>org.elasticsearch.clientgroupId>
<artifactId>elasticsearch-rest-high-level-clientartifactId>
<version>6.2.3version>
dependency>
dependencies>
LowLevelClient
static RestClientBuilder restClientBuilder = RestClient.builder(
new HttpHost("127.0.0.1", 9200, "http"));
static RestClient client = restClientBuilder.build();
, socket
builder.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
@Override
public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder requestConfigBuilder) {
requestConfigBuilder.setConnectTimeout(10000); // server
requestConfigBuilder.setSocketTimeout(30000); //
requestConfigBuilder.setConnectionRequestTimeout(10000); // connection
return requestConfigBuilder;
}
});
//
builder.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
return httpClientBuilder.setDefaultIOReactorConfig(
IOReactorConfig.custom()
.setIoThreadCount(100)
.setConnectTimeout(10000)
.setSoTimeout(10000)
.build());
}
});
RestHighLevelClient
high level client
static RestClientBuilder restClientBuilder = RestClient.builder(
new HttpHost("127.0.0.1", 9200, "http"));
static RestClient client = restClientBuilder.build();
static RestHighLevelClient highLevelClient = new RestHighLevelClient(restClientBuilder);
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("test"); // indexName
searchRequest.types("type1"); // type
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchAllQuery()); // , entity ,
searchRequest.source(sourceBuilder);
SearchResponse searchResponse = highLevelClient.search(searchRequest); // json
알고 싶으면 하이레벨 클라이언트가 어떻게 봉인되는지 간단히 보세요.
/**
* Request::search java8 SearchRequest HttpRequest, HttpPost.METHOD_NAME, endpoint, params, entity
*
* SearchResponse::fromXContent json SearchResponse
*/
public final SearchResponse search(SearchRequest searchRequest, Header... headers) throws IOException {
return performRequestAndParseEntity(searchRequest, Request::search, SearchResponse::fromXContent, emptySet(), headers);
}
여기에는 자바8의 특성을 많이 활용하는데 함수식은 C++와 유사하게 함수 바늘을 전달한다.CheckedFunction, 메모 구조의 함수 인터페이스를 사용합니다.
// performRequest RestClient , http 。
protected final Resp performRequestAndParseEntity(Req request,
CheckedFunction requestConverter,
CheckedFunction entityParser,
Set ignores, Header... headers) throws IOException {
return performRequest(request, requestConverter, (response) -> parseEntity(response.getEntity(), entityParser), ignores, headers);
}
ps: CheckedFunction ,
@FunctionalInterface
public interface CheckedFunction<T, R, E extends Exception> {
R apply(T t) throws E;
}
Parse Entity의 논리를 다시 한 번 볼게요.
protected final Resp parseEntity(final HttpEntity entity,
final CheckedFunction entityParser) throws IOException {
if (entity == null) {
throw new IllegalStateException("Response body expected but not returned");
}
if (entity.getContentType() == null) {
throw new IllegalStateException("Elasticsearch didn't return the [Content-Type] header, unable to parse response body");
}
XContentType xContentType = XContentType.fromMediaTypeOrFormat(entity.getContentType().getValue());
if (xContentType == null) {
throw new IllegalStateException("Unsupported Content-Type: " + entity.getContentType().getValue());
}
// parser, JsonParser,registry , 。 Builder
try (XContentParser parser = xContentType.xContent().createParser(registry, entity.getContent())) {
return entityParser.apply(parser); // , SearchResponse::fromXContent
}
}
이전에 자바8을 보는 것이 비교적 적었기 때문에 처음에 이런 함수식이 변하는 것을 보았는데 머리를 멈추고 자꾸 이리저리 뛰어다니는 것을 보았는데 논리는 하나의 선이 아니다.
TcpClient 9300
이것은 RestClient처럼 간단하지 않고 tcp로 서열화된 데이터를 직접 전달합니다.예를 들어 Index Request에서 readFrom과 writeTo 같은 방법을 볼 수 있다.
공식 문서 참조:https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/transport-client.html
초기화
TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new TransportAddress(InetAddress.getByName("host1"), 9300))
.addTransportAddress(new TransportAddress(InetAddress.getByName("host2"), 9300));
// on shutdown
client.close();
// RestClient,TransportClient , , 。 。
Settings settings = Settings.builder()
.put("client.transport.sniff", true).build();
TransportClient client = new PreBuiltTransportClient(settings);
index 만들기
블로그 내용 참조JAVA 클라이언트의 TransportClient 작업 상세 정보
, url, 。
CreateIndexRequestBuilder cib=client.admin().indices().prepareCreate(article);
XContentBuilder mapping = XContentFactory.jsonBuilder()
.startObject()
.startObject("properties") //
.startObject("author")
.field("type","string") //
.endObject()
.startObject("title")
.field("type","string")
.endObject()
.startObject("content")
.field("type","string")
.endObject()
.startObject("price")
.field("type","string")
.endObject()
.startObject("view")
.field("type","string")
.endObject()
.startObject("tag")
.field("type","string")
.endObject()
.startObject("date")
.field("type","date") // Date
.field("format","yyyy-MM-dd HH:mm:ss") // Date
.endObject()
.endObject()
.endObject();
cib.addMapping(content, mapping);
CreateIndexResponse res=cib.execute().actionGet();
주: 공식 API 문서에서 구체적인 사용 방식을 볼 수 있습니다. 여기서 앞서 만난 위 1, 많은 경우 집단 상부에서 LB, LVS 같은 것을 포장하여 부하 균형을 잡습니다. 클라이언트는 사실 간단한 윤문이 있는 부하 균형이 있습니다.주의해야 할 것은 LB를 연결할 때 u는 반드시 긴 연결을 유지해야 한다는 것이다.이전에 이런 문제가 발생했습니다. 연결session을 저장하지 않았습니다. 다음 요청이 온 후에 LB는 session을 끊었습니다. 이때 Node Not Avalibale의 문제를 계속 보고했습니다.세션이 끊어졌기 때문일 것입니다. 이 때 다른 노드에 연결되면 연결이 되지 않았기 때문에 오류가 발생합니다.2. 사용자 정의 설정 설정이 있으면 기억하십시오.elasticsearch는 settings를 해석할 때 json 데이터가 끼워넣은 맵으로 변환된다고 합니다. 따라서 플러그인이나 원본 코드를 직접 바꾸어 대응하는 settings를 일일이 등록하지 않았을 때 오류를 보고합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
kafka connect e elasticsearch를 관찰할 수 있습니다.No menu lateral do dashboard tem a opção de connectors onde ele mostra todos os clusters do kafka connect conectados atu...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.