[英]ElasticSearch retrieves documents slowly
我正在使用 Java_API 從 ElasticSearch 檢索記錄,在 Java 應用程序中檢索 100000 個文檔(記錄/行)大約需要 5 秒。
ElasticSearch 速度慢嗎? 還是正常的?
這是索引設置:
我試圖獲得更好的性能但沒有結果,這是我所做的:
將 ElasticSearch 堆空間設置為 3GB,它是 1GB(默認) -Xms3g
-Xmx3g
從 7200 RPM 硬盤遷移 SSD 上的 ElasticSearch
只檢索一個歸檔而不是 30
這是我的 Java 實現代碼
private void getDocuments() {
int counter = 1;
try {
lgg.info("started");
TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9300));
SearchResponse scrollResp = client.prepareSearch("ebpp_payments_union").setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(QueryBuilders.matchAllQuery())
.setScroll(new TimeValue(1000))
.setFetchSource(new String[] { "payment_id" }, null)
.setSize(10000)
.get();
do {
for (SearchHit hit : scrollResp.getHits().getHits()) {
if (counter % 100000 == 0) {
lgg.info(counter + "--" + hit.getSourceAsString());
}
counter++;
}
scrollResp = client.prepareSearchScroll(scrollResp.getScrollId())
.setScroll(new TimeValue(60000))
.execute()
.actionGet();
} while (scrollResp.getHits().getHits().length != 0);
client.close();
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
我知道不推薦使用
TransportClient
,我也嘗試過RestHighLevelClient
,但它沒有改變任何東西。
你知道如何獲得更好的性能嗎?
我應該更改 ElasticSearch 中的某些內容還是修改我的 Java 代碼?
如果不了解所涉及的所有內容,就很難進行性能故障排除/調整,但這似乎不是很快。 因為這是一個單節點集群,您將遇到一些性能問題。 如果這是一個生產集群,則每個分片至少有一個副本,也可用於讀取。
您還可以做一些其他事情:
我看到了三個可能的優化軸:
1/ 在 _doc 鍵上對文檔進行排序:
當排序順序為 _doc 時,滾動請求具有優化,可以使它們更快。 如果您想遍歷所有文檔而不考慮順序,這是最有效的選項:
( 文檔來源)
2/ 減小頁面大小,10000 似乎是一個很高的值。 你能用 5000 /1000 等減少的值進行差異測試嗎?
3/ 去除源過濾
.setFetchSource(new String[] { "payment_id" }, null)
進行源過濾可能很繁重,因為彈性節點需要讀取源,在 Object 中進行轉換,然后進行過濾。 那么你可以嘗試刪除它嗎? 網絡負載會增加,但這是一筆交易:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.