Elasticsearch 5.x插件
該項目已被棄用,不會再維護的,請使用最新的PARA插件進行Elasticsearch
Para被設計為一個簡單而模塊化的後端框架,用於對象持久性和檢索。它使您的應用程序能夠直接存儲對像到數據存儲(NOSQL)或任何關係數據庫(RDBMS),並且還可以自動索引這些對象並使其可搜索。
該插件允許您將Elasticsearch用作Para的搜索引擎,並且僅與5.X版本的Elasticsearch兼容。
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 >另外,您可以從上面的“發行”選項卡中下載JAR,將其與服務器戰爭文件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系統屬性或class路徑上的application.conf文件的一部分。這告訴PARA使用Elasticsearch實現而不是默認設備(Lucene)。
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和搜索之間的數據一致性需要高度的信心,仍然建議使用啟用的異步索引並啟用了同步索引。如果您希望使用異步索引,但請在每次調用索引/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啟用,默認情況下已關閉。當啟用共享的共享索引時,為其創建了一個特殊的別名,其中包含一個路由字段,該路由字段將兒童應用程序的所有文檔發送到特定的碎片,同時在應用程序之間提供總隔離。當有很多較小的應用程序只有幾百個文檔時,這很有用,我們希望避免每個應用程序一個索引的開銷。
Apache 2.0