Para 용 Elasticsearch 5.x 플러그인
이 프로젝트는 더 이상 사용되지 않으며 더 이상 유지 관리되지 않습니다. Elasticsearch에는 최신 Para 플러그인을 사용하십시오.
Para는 객체 지속성 및 검색을위한 간단하고 모듈 식 백엔드 프레임 워크로 설계되었습니다. 응용 프로그램은 객체를 데이터 스토어 (NOSQL) 또는 관계형 데이터베이스 (RDBMS)에 직접 저장할 수 있으며 해당 객체를 자동으로 색인화하여 검색 가능합니다.
이 플러그인을 사용하면 Elasticsearch를 Para의 검색 엔진으로 사용할 수 있으며 Elasticsearch의 5.x 버전과 호환 됩니다.
Search 인터페이스를 구현하고 전송 클라이언트를 지원합니다DAO 인터페이스를 구현하여 ElasticSearch를 데이터베이스로 사용할 수 있습니다 (생산을 피하십시오!)/v1/_elasticsearch 모든 요청을 Elasticsearch (기본적으로 비활성화)로 직접 릴레이합니다. 플러그인은 Maven Central에 있습니다. pom.xml 에 포함시킬 Maven 스 니펫은 다음과 같습니다.
< dependency >
< groupId >com.erudika</ groupId >
< artifactId >para-search-elasticsearch-v5</ artifactId >
< version >{see_green_version_badge_above}</ version >
</ dependency > 또는 위의 "릴리스"탭에서 항아리를 다운로드 할 수 있습니다. 서버 전쟁 파일 para-xyzwar 와 함께 lib 폴더에 넣습니다. Para는 lib 내부의 플러그인을 찾고 Elasticsearch 플러그인을 선택합니다.
application.conf 플러그인의 모든 구성 속성은 다음과 같습니다.
# enable this to bypass the DB and read all data straight from ES
para.read_from_index = false
para.es.shards = 5
para.es.replicas = 0
para.es.dir = " data "
para.es.auto_expand_replicas = " 0-1 "
para.es.use_transportclient = false
para.es.transportclient_host = " localhost "
para.es.transportclient_port = 9300
para.es.fail_on_indexing_errors = false
# asynchronous settings
para.es.async_enabled = false
para.es.bulk.size_limit_mb = 5
para.es.bulk.action_limit = 1000
para.es.bulk.concurrent_requests = 1
para.es.bulk.flush_interval_ms = 5000
para.es.bulk.backoff_initial_delay_ms = 50
para.es.bulk.max_num_retries = 8
para.es.bulk.flush_immediately = false
# proxy settings
para.es.proxy_enabled = false
para.es.proxy_path = " _elasticsearch "
para.es.restclient_scheme = " http "
para.es.restclient_host = " localhost "
para.es.restclient_port = 9200마지막으로 구성 속성을 설정하십시오.
para.search = "ElasticSearch"
이것은 클래스 경로의 Java 시스템 속성 또는 application.conf 파일의 일부일 수 있습니다. 이를 통해 Para는 기본값 (Lucene) 대신 Elasticsearch 구현을 사용하도록 지시합니다.
Elasticsearch 플러그인은 동기 (기본값) 및 비동기 인덱싱 모드를 모두 지원합니다. 동기 인덱싱의 경우 Elasticsearch 플러그인은 클라이언트를 통한 단일 차단 요청을 만들고 응답을 기다립니다. 이는 각 문서 작동 (인덱스, Reindex 또는 Delete)이 새 클라이언트 요청을 호출 함을 의미합니다. 특정 응용 프로그램의 경우 Elasticsearch 클러스터에서 무거운 하중을 유도 할 수 있습니다. 그러나 동기 인덱싱의 장점은 요청의 결과가 클라이언트 응용 프로그램에 다시 전달 될 수 있다는 것입니다. para.es.fail_on_indexing_errors 가 true 로 설정된 경우, 오류가 발생하는 동기 요청이 HTTP 오류 코드를 사용하여 클라이언트 응용 프로그램으로 다시 전파됩니다.
비동기 인덱싱 모드는 Elasticsearch BulkProcessor를 사용하여 모든 요청을 Elasticsearch 클러스터에 배치합니다. 비동기 모드가 활성화되면 모든 문서 요청이 벌크 프로세서에 공급되며 때때로 요청을 클러스터로 플러시합니다. 문서 수, 총 문서 크기 (MB) 및 총 기간 (MS)을 기반으로 플러시 주파수를 제어하기위한 몇 가지 구성 가능한 매개 변수가 있습니다. Elasticsearch는 거의 실시간 검색 엔진으로 설계되었으므로 비동기 모드를 적극 권장합니다. 가끔 더 큰 배치의 문서 요청을 만들면 Elasticsearch 클러스터의 하중을 줄이는 데 도움이됩니다.
비동기 인덱싱 모드는 또한 실패한 인덱싱 요청을 자동으로 재 시도하기위한 매력적인 기능을 제공합니다. Elasticsearch 클러스터가 무거운 부하를 받고 있다면 새 문서를 색인화하라는 요청이 거부 될 수 있습니다. 동기 인덱싱을 통해 클라이언트 애플리케이션의 부담은 인덱싱 요청을 다시 시도합니다. 그러나 Elasticsearch BulkProcessor는 검색 간 지수 백 오프로 인덱스 요청을 자동으로 재 시도하는 유용한 기능을 제공합니다. EsRejectedExecutionException 으로 인덱스 요청이 실패하면 요청은 para.es.bulk.max_num_retries times까지 재조정됩니다. 유스 케이스가 DAO와 검색 간의 데이터 일관성과 관련하여 높은 수준의 신뢰를 요구하더라도 여전히 검토를 활성화 한 상태에서 비동기 인덱싱을 사용하는 것이 좋습니다. 비동기 인덱싱을 원하지만 인덱스/unindex/indexall/unindexall을 호출 할 때마다 벌크 프로세서를 플러시하는 경우, 단순히 para.es.bulk.flush_immediately 활성화하십시오. 이 옵션이 활성화되면 요청에 문서를 추가 한 후 즉시 Bulkprocessor의 플러시 메소드가 호출됩니다. 이 옵션은 또한 문서가 즉시 플러시되는지 확인하는 단위 테스트를 작성하는 데 유용합니다.
이 플러그인에는 정상 과 중첩 된 두 가지 인덱싱 모드가 있습니다. 중첩 모드는 V1.28 이후에 추가되어 가능한 매핑 폭발로부터 보호하여 다양한 사용자 정의 속성이있는 많은 객체가있을 때 발생합니다. 이것은 Elasticsearch Index Metadata를 과부하시키고 전체 클러스터에 충돌 할 수 있습니다. 이 인덱싱 모드는 Sysprop 객체의 사용자 정의 속성에만 영향을 미칩니다.
기존 "정상"모드는 대부분의 PARA 배포에 적합하며, 임차인 또는 단일 테넌트 (서버 당 하나의 앱) 만 있으면됩니다. 이 모드에서는 Para 객체가 수정없이 인덱싱되지만 (모든 데이터 유형은 보존) 매핑 폭발로 이어질 수 있습니다.
이 두 인덱싱 모드의 중첩 데이터 구조는 다음과 같습니다.
// NORMAL MODE // NESTED MODE
{ {
"id": "123", "id": "123",
"appid": "para", "appid": "para",
"type": "custom", "type": "custom",
"properties": { "properties": [
"key1": "value1", {"k": "key1", "v": "value1"},
"key2": { {"k": "key2-subkey1", "v": "subValue1"},
"subkey1": "subValue1" {"k": "numericKey3", "vn": 5}
}, ],
"numericKey3": 5 "_properties": "{"key1":"value1"}..."
} }
}
새 중첩 인덱싱 모드로 전환하는 것은 구성 속성으로 수행됩니다.
para.es.es.use_nested_custom_fields = true
"중첩"모드를 사용할 때 또 다른 이점은 쿼리 문자열의 중첩 쿼리를 지원하는 것입니다. 이 글을 쓰는 시점에서 Elasticsearch (Elastic/Elasticsearch#11322)에서 아직 구현되지 않은 정말 유용한 기능입니다. 더 나은 것은, 당신은 핀 포인트 정밀도로 중첩 어레이 내의 객체를 쿼리 할 수 있습니다 ?q=properties.nestedArray[2].key:value 접두사 properties.* . 쿼리 문자열 쿼리의 예 :
/v1/search?q=term AND properties.owner.age:[* TO 34]
/v1/search?q=properties.owner.name:alice OR properties.owner.pets[1].name=whiskers
참고 : 중첩 필드를 정렬하면 숫자 데이터에서만 작동합니다. 예를 들어, 필드 properties.year 정렬하면 생식이 작동하지만 properties.month 정렬하면 Month가 아닙니다 ( "중첩"모드에만 적용 가능).
/v1/_elasticsearch 통해 Elasticsearch API를 직접 호출 할 수 있습니다. 활성화하려면 para.es.proxy_enabled = true first를 설정합니다. 그런 다음 path 매개 변수가 Elasticsearch API 리소스 경로에 해당해야합니다. 이는 Elasticsearch에 대한 GET , PUT , POST , PATCH 또는 DELETE 요청에 대해 수행됩니다. 엔드 포인트는 /v1/_elasticsearch 또는 /v1/_elasticsearch/{path} 에 대한 요청을 허용합니다. 여기서 path 는 URL에 인코딩 된 경로 매개 변수입니다. 요청 경로에 쿼리 매개 변수를 추가하지 않습니까 ? 대신 매개 변수 맵으로 전달하십시오.
GET /v1/_elasticsearch/_search
GET /v1/_elasticsearch/mytype%2f_search
DELETE /v1/_elasticsearch/tweet%2f1
ParaClient 예 :
Response get = paraClient . invokeGet ( "_elasticsearch/" + Utils . urlEncode ( "tweet/_search" ), params );
Response post = paraClient . invokePost ( "_elasticsearch/_count" ,
Entity . json ( Collections . singletonMap ( "query" ,
Collections . singletonMap ( "term" ,
Collections . singletonMap ( "type" , "cat" ))))); path 매개 변수가 생략되면 기본적으로 _search 로 표시됩니다.
응답 객체는 파라 클라이언트와 호환되도록 변환됩니다.
{
"page" : 0 ,
"totalHits" : 3 ,
"items" : [ { ... } ]
} Elasticsearch에서 원시 쿼리 응답을 얻으려면 getRawResponse=true 를 requst 경로에 추가하고 URL-incode를 추가하십시오.
GET /v1/_elasticsearch/mytype%2f_search%3FgetRawResponse%3Dtrue
동등하게, ParaClient 사용하여 쿼리 매개 변수를 추가하여 동일하게 수행 할 수 있습니다.
MultivaluedHashMap<String, String> params = new MultivaluedHashMap<>();
params.putSingle("getRawRequest", "true");
paraClient.invokeGet("_elasticsearch/" + Utils.urlEncode("mytype/_search"), params);
참고 : 이 엔드 포인트에는 인증이 필요하며 서명되지 않은 요청은 허용되지 않습니다. Elasticsearch에 대한 모든 요청은 앱 식별자와 접두사가 있습니다. 예를 들어 앱 ID가 "app : myapp, para는 http://eshost:9200/myapp/{path} 에서 elasticsearch에 대한 요청을 프록시합니다.
POST /v1/_elasticsearch/reindex 호출하여 전체 앱 색인을 처음부터 처음부터 재구성 할 수 있습니다. 활성화하려면 para.es.proxy_reindexing_enabled = true first를 설정합니다. 이 작업은 ElasticSearchUtils.rebuildIndex() 내부적으로 실행하고 다시 표시된 객체의 수와 경과 시간을 나타내는 응답을 반환합니다.
{
"reindexed": 154,
"tookMillis": 365
}
또한 대상 지수를 지정하여 Reindex로 지정할 수 있으며 미리 작성해야합니다.
POST /v1/_elasticsearch/reindex?destinationIndex=yourCustomIndex
플러그인은 또한 인덱스 공유를 지원하므로 루트 앱 인덱스는 플래그 app.isSharingIndex = true 으로 생성 된 다른 앱과 공유됩니다. 이 기능은 para.es.root_index_sharing_enabled = true 로 활성화되어 있으며 기본적으로 꺼져 있습니다. 공유 활성화로 루트 색인이 생성되면, 하위 앱의 모든 문서를 특정 샤드로 보내는 동시에 앱간에 총 격리를 제공하는 라우팅 필드가 포함 된 특수 별명이 생성됩니다. 이는 각각 수백 문서가있는 작은 앱이 많이있을 때 유용하며 앱 당 하나의 인덱스의 오버 헤드를 피하려고합니다.
아파치 2.0