2014-01-22 86 views
0
IndexResponse response = client.prepareIndex("face", "book","1") 
       .setSource(jsonBuilder() 
         .startObject() 
         .field("name", "kimchy") 
         .field("postDate", "2010-03-01") 
         .field("message", "trying out Elastic Search") 
         .endObject() 
       ) 
       .execute() 
       .actionGet(); 
String index = response.getIndex(); // index : "face" 

SearchResponse r = client.prepareSearch("face") 
    .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) 
    .setQuery(QueryBuilders.termQuery("name","kimchy")) 
    .setFrom(0).setSize(60).setExplain(true) 
    .execute() 
    .actionGet(); 
     System.out.println(r); 
     SearchHit[] hits = r.getHits().getHits(); 
     System.out.println(hits.length); // 0 Hits 
     for (SearchHit searchHit : hits) { 
     // no hits no data 
     } 

我該如何解決這個問題,這裏的問題在哪裏?如果我寫了prepareIndex(「twitter」,「tweet」,「1」)和client.prepareIndex,我會嘗試一切,但我無法修復。我會很高興,如果有人幫我解決這個問題。 (「twitter」,「tweet」,「1」)它給了我一些結果,但我認爲這是默認結果。我想搜索特定的單詞,我想要的。如何使用Elasticsearch進行索引和搜索

回答

0

嘗試增加

.setRefresh(true) 

爲了您的通話client.prepareIndex

+0

儘管此解決方案有效,但它意味着您應該手動刷新您的索引。正如我確信@mconlin知道,但沒有說過,手動刷新用於測試目的很好,但如果在每個請求上完成,將會對生產產生性能影響。最好讓Elasticsearch在後臺自動執行它。 – DrTech

1

的問題是,搜索在近實時的工作,這意味着刷新需要你爲了索引的文檔後發生因爲它可用於搜索。

默認情況下,刷新每秒自動發生,但在測試中,您需要手動調用刷新以確保找到文檔,或者切換到使用實時工作的get api,以確保該文件存在,並通過id返回。

在添加刷新的情況下,您可以調用刷新API或將刷新標誌添加到索引操作,以便在文檔編制索引後進行刷新。請記住,這是測試時的良好習慣,但在生產中,您的代碼不應該手動調用刷新,只需讓自動刷新在每秒鐘內完成。

+0

Thnx回覆它確實有效。 所以你的意思是 索引 - Thread.sleep(60000)和 搜索操作正常嗎? 手動刷新的無用方面是什麼? – user3077045

+0

Thread.sleep的作品,但不是那麼優雅...手動刷新的缺點是性能,一個新的lucene段被刷新,如果你同時索引很多文檔,並且在每次索引操作後刷新......好你的吞吐量會吸收:) – javanna

+0

這表示在測試期間刷新很好,在生產中讓搜索接近實時,就是這樣。 – javanna

相關問題