出于测试目的,我想使用嵌入式弹性搜索。然而,我正在努力让它发挥作用。
我尝试设置一个非常简单的测试,其中我:
似乎一切都很顺利,直到我统计不断返回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
}
我尝试了这段代码的几种变体,但都没有成功。
我做错了什么?
答案 0 :(得分:2)
我也经常绊倒这个!
ElasticSearch近乎实时的问题&#34;实际上并不是实时的。在索引文档和可用于搜索之间存在延迟(称为刷新间隔)。
GET操作是一种特殊情况,因为它使用文档的ID,即使在搜索可用之前也可以直接加载。
此处的ElasticSearch文档中解释了这种情况的机制:https://www.elastic.co/guide/en/elasticsearch/guide/current/near-real-time.html
对于运行本地测试的特定问题,您需要确保在运行任何查询(包括计数)之前刷新索引。 Refresh API可用于此目的。 (在其他情况下,使用Refresh API被视为反模式,因为等待刷新间隔通常是索引文档的最有效方式。)