gpt4 book ai didi

java - 本地 Elasticsearch 无法检索索引文档

转载 作者:行者123 更新时间:2023-12-02 04:38:19 25 4
gpt4 key购买 nike

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

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

  1. 创建本地 Elasticsearch
  2. 创建新索引
  3. 索引文档
  4. 获取文档
  5. 计算索引中的文档数量

似乎一切都很顺利,直到我计算出不断返回 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
}

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

我做错了什么?

最佳答案

我也经常被这个绊倒!

ElasticSearch“接近实时”的问题实际上并非实时。对文档建立索引和可用于搜索之间存在延迟(称为刷新间隔)。

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

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

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

关于java - 本地 Elasticsearch 无法检索索引文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30486046/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com