2013-10-30 94 views
0

我想使用ElasticSearch,所以我構建了一個簡單的JUnit測試,但測試花費了5秒來運行,我認爲它非常慢。不知道我錯過了什麼嗎?爲什麼Elasticsearch在Junit測試中速度如此之慢?

 Node node = NodeBuilder.nodeBuilder().node(); 
     Client client = node.client(); 

     BulkRequestBuilder brb = client.prepareBulk(); 

     Map<String, Object> json = new HashMap<>(); 
     Map<String, Object> nest = new HashMap<>(); 
     nest.put("foo", "blah"); 

     json.put("Code", "123"); 
     json.put("nut", nest); 
     json.put("images", newArrayList("image1", "image2")); 

     brb.add(new IndexRequest("promotions", "promotion").source(json)); 
     brb.execute().actionGet(); 

     MatchQueryBuilder itemNumber = QueryBuilders.matchQuery("Code", "123"); 
     SearchResponse sr = client.prepareSearch("promotions").setTypes("promotion").setQuery(itemNumber).execute().actionGet(); 

     assertThat((List)sr.getHits().getHits()[0].getSource().get("images")).contains("image1"); 
     assertThat((List)sr.getHits().getHits()[0].getSource().get("images")).contains("image2"); 
     assertThat((List)sr.getHits().getHits()[0].getSource().get("images")).doesNotContain("image3"); 
+1

它在內存中構建一個es實例來運行測試,所以這可能會有點慢。你是否將測試的搜索部分與測試的初始化部分進行了比較? – mconlin

+0

搜索部分非常快,但初始化和索引需要一段時間。 – toy

回答

0

您可能想切換到本地節點進行測試。這樣您可以禁用禪宗發現,並且只有在同一個jvm中運行的其他節點才能加入同一個羣集。另外,在節點之間沒有tcp傳輸(如果你有多個,看起來不是這種情況),因爲它們在同一個jvm中。您的節點仍然會打開http傳輸(默認情況下爲9200端口),如果您不需要它,您可能需要禁用該傳輸。

而且,不要忘記設置集羣名稱!如果有其他節點以相同的集羣名稱運行,則在開始測試時節點正在執行的操作是查看網絡。如果是這種情況,它將加入現有羣集,並開始與其他節點共享數據,導致奇怪的測試行爲。

Node node = NodeBuilder.nodeBuilder().clusterName("my_cluster").local(true).node(); 
+0

奇怪的是,我剛剛添加了我的clusterName,測試失敗。不知道爲什麼這可能會導致我的測試失敗?這就是我所做的。 Node node = NodeBuilder.nodeBuilder()。clusterName(「Andreas von Strucker」)。local(true).node();.這就像文件沒有正確索引,所以它無法通過搜索api找到文件。 – toy

+0

不知道爲什麼這與更改羣集名稱有關,可能是您加入已經包含該文檔的現有羣集?我想問題是你需要調用刷新api才能找到新文檔。否則,您可以使用實時工作的get api(通過id)。 – javanna

相關問題