本地Elasticsearch无法检索索引文档

时间:2015-05-27 14:53:28

标签: java elasticsearch

出于测试目的,我想使用嵌入式弹性搜索。然而,我正在努力让它发挥作用。

我尝试设置一个非常简单的测试,其中我:

  1. 创建本地Elasticsearch
  2. 创建新索引
  3. 索引文档
  4. 获取文档
  5. 计算索引中的文档数
  6. 似乎一切都很顺利,直到我统计不断返回0的文件。

    这是我的Junit测试:

    private Node node;
    
    @Rule
    public TemporaryFolder tmp = new TemporaryFolder();
    
    @Before
    public void init() {
        Settings settings = ImmutableSettings.settingsBuilder()
                .put("path.data", tmp.getRoot().getPath())
                .build();
        node = NodeBuilder.nodeBuilder().local(true)
                .settings(settings).data(true).build();
        node.start();
    }
    
    @After
    public void stop() {
        node.stop();
    }
    
    @Test
    public void testLocal() {
        Client client = node.client();
    
        // Create index
        client.admin().indices().prepareCreate("index_name").execute().actionGet();
    
        // Index doc
        Map<String, Object> docFields = new HashMap<>();
        docFields.put("key", "value");
        client.prepareIndex("index_name", "index_type", "1")
                .setSource(docFields).execute().actionGet();
    
        // Get
        GetResponse gr = client.prepareGet("index_name", "index_type", "1")
                .execute().actionGet();
        // Count
        CountResponse cr = client.prepareCount("index_name").execute().actionGet();
    
        Assert.assertTrue(gr.isExists());        // SUCCESS
        Assert.assertEquals(1L, cr.getCount());  // FAILURE: actual is 0
    }
    

    我尝试了这段代码的几种变体,但都没有成功。

    我做错了什么?

1 个答案:

答案 0 :(得分:2)

我也经常绊倒这个!

ElasticSearch近乎实时的问题&#34;实际上并不是实时的。在索引文档和可用于搜索之间存在延迟(称为刷新间隔)。

GET操作是一种特殊情况,因为它使用文档的ID,即使在搜索可用之前也可以直接加载。

此处的ElasticSearch文档中解释了这种情况的机制:https://www.elastic.co/guide/en/elasticsearch/guide/current/near-real-time.html

对于运行本地测试的特定问题,您需要确保在运行任何查询(包括计数)之前刷新索引。 Refresh API可用于此目的。 (在其他情况下,使用Refresh API被视为反模式,因为等待刷新间隔通常是索引文档的最有效方式。)