Para的Elasticsearch插件
Para被设计为一个简单而模块化的后端框架,用于对象持久性和检索。它使您的应用程序能够直接存储对象到数据存储(NOSQL)或任何关系数据库(RDBMS),并且还可以自动索引这些对象并使其可搜索。
该插件允许您将Elasticsearch用作Para的搜索引擎。
Search接口/v1/_elasticsearch将所有请求直接继电给Elasticsearch(默认为禁用)| ES插件版本 | Elasticsearch支持 | OpenSearch支持 |
|---|---|---|
1.40.0及以上 | 8.x及以上(带有配置标志) | 1.0.0及以上(带有配置标志) |
1.39.0及以下 | 最多7.15.2 | 1.0.0及以上 |
版本1.40.0之后,需要一个配置标志才能在Eleasticsearch的两种不同口味之间进行命名:
para.es.flavor = " elasticsearch "
# ==== OR ==== #
para.es.flavor = " opensearch "这里的默认选项是elasticsearch 。
该插件位于Maven Central上。这是在pom.xml中包含的Maven片段:
< dependency >
< groupId >com.erudika</ groupId >
< artifactId >para-search-elasticsearch</ artifactId >
< version >{see_green_version_badge_above}</ version >
</ dependency >另外,您可以从上面的“发行”选项卡中下载JAR,将其与服务器战争文件para-xyzwar一起放入lib文件夹中。 Para将在lib中寻找插件并拾取Elasticsearch插件。
这是此插件的所有配置属性(其中包含在您的application.conf内):
# ES flavor - elasticsearch or opensearch
para.es.flavor = " elasticsearch "
# 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.restclient_scheme = " http "
para.es.restclient_host = " localhost "
para.es.restclient_port = 9200
# context path of elasticsearch e.g. /es
para.es.restclient_context_path = " "
para.es.sign_requests_to_aws = false
para.es.aws_region = " eu-west-1 "
para.es.fail_on_indexing_errors = false
para.es.track_total_hits = 10000
# if login and password are filled then add for each request
# the Authorization header with basic auth
para.es.basic_auth_login = " "
para.es.basic_auth_password = " "
# 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.proxy_reindexing_enabled = false最后,设置配置属性:
para.search = "ElasticSearch"
这可能是java系统属性或class路径上的application.conf文件的一部分。这告诉PARA使用Elasticsearch实现而不是默认设备(Lucene)。
ES的较新版本默认使用HTTPS,并在第一个启动时生成唯一的SSL证书。要获得成功的连接,您应该首先将ES服务器的生成CA添加到Java密钥库中,表明您信任该证书。这是执行此操作的控制台命令:
echo -n |
openssl s_client -connect localhost:9200 |
sed -ne ' /-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p ' > ./ca_elasticsearch.cer &&
keytool -import -alias saelk -file ca_elasticsearch.cer -keystore ${JAVA_HOME} /lib/security/cacerts -storepass changeit最后,设置para.es.restclient_scheme = "https" 。
Elasticsearch插件支持同步(默认)和异步索引模式。对于同步索引,Elasticsearch插件将通过客户端进行单个阻止请求并等待响应。这意味着每个文档操作(索引,reindex或Delete)都调用新客户请求。对于某些应用,这可能会导致弹性搜索集群的重负载。但是,同步索引的优点是可以将请求的结果传达回客户端应用程序。如果设置para.es.fail_on_indexing_errors设置为true ,则导致错误的同步请求将带有HTTP错误代码回到客户端应用程序。
异步索引模式使用Elasticsearch BulkProcessor将所有请求批量到Elasticsearch群集。如果启用了异步模式,则所有文档请求都将被送入BulkProcessor,该请求有时会冲洗到群集。有几个可配置的参数可以基于文档计数,文档总数(MB)和总持续时间(MS)来控制齐平频率。由于Elasticsearch被设计为接近实时的搜索引擎,因此强烈建议使用异步模式。偶尔进行较大的文档请求将有助于减少Elasticsearch集群的负载。
异步索引模式还为自动重试失败的索引请求提供了吸引人的功能。如果您的Elasticsearch集群负载重负载,则可能会拒绝索引新文档的请求。通过同步索引,负担属于客户端应用程序,以再次尝试索引请求。但是,Elasticsearch Bulkprocessor提供了一个有用的功能,可以自动重试,并在重试之间进行指数退回。如果索引请求使用EsRejectedExecutionException失败,则该请求将被重新归还到para.es.bulk.max_num_retries Times。即使您的用例就数据库( DAO )和索引( Search )之间的数据一致性具有高度的信心,但仍建议使用启用的异步索引进行启用。如果您希望使用异步索引,但请在每次调用索引/unIndex/indexall/unIndexall的调用中汇总BulkProcessor,请立即启用para.es.bulk.flush_immediately 。启用此选项后,在请求中添加文档后,将立即调用BulkProcessor的齐平方法。此选项对于编写单元测试也很有用,您要确保文档及时齐平。
该插件具有两个索引模式:正常和嵌套。在V1.28之后添加了嵌套模式,以防止可能在其中有很多不同自定义属性的对象时发生的可能的映射爆炸。这超载了Elasticsearch索引元数据,并可能崩溃整个集群。此索引模式仅影响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 。
响应对象将被转换为与Para客户端兼容,看起来像这样:
{
"page" : 0 ,
"totalHits" : 3 ,
"items" : [ { ... } ]
}如果您想从Elasticsearch获取原始查询响应,请添加参数getRawResponse=true将其添加到requst路径中,并添加url-nur-insode IT:
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
}
此外,您可以指定要重新索引的目标索引,必须事先创建该索引:
POST /v1/_elasticsearch/reindex?destinationIndex=yourCustomIndex
该插件还支持索引共享,从而将根应用索引与其他使用flag app.isSharingIndex = true创建的应用共享。该功能由para.es.root_index_sharing_enabled = true启用,默认情况下已关闭。当启用共享的共享索引时,为其创建了一个特殊的别名,其中包含一个路由字段,该路由字段将儿童应用程序的所有文档发送到特定的碎片,同时在应用程序之间提供总隔离。当有很多较小的应用程序只有几百个文档时,这很有用,我们希望避免每个应用程序一个索引的开销。
IndexBasedDAO已被删除,因为它有很多问题。Apache 2.0