2014-01-22 378 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

相关问题