2015-05-27 2 views
0

Для целей тестирования я хочу использовать встроенный поиск упругости. Но я изо всех сил пытаюсь заставить его работать.Локальный Elasticsearch не может получить индексированные документы

Я попытался установить очень простой тест, в котором я:

  1. Создать локальную Elasticsearch
  2. Создать новый индекс
  3. Index документ
  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 
} 

Я попробовал несколько вариантов этого кода, но ни один не был успешным.

Что я делаю неправильно?

ответ

2

Я регулярно совершаю поездку по этому тоже!

Проблема в том, что ElasticSearch находится «в режиме реального времени», а не в реальном времени. Существует задержка (известная как интервал обновления) между индексацией документа и возможностью ее поиска.

Операция GET - это особый случай, так как он использует идентификатор документа, который может быть загружен непосредственно до того, как он будет доступен для поиска.

Механика ситуаций объясняются в документации ElasticSearch здесь: https://www.elastic.co/guide/en/elasticsearch/guide/current/near-real-time.html

Для конкретной проблемы запуска локальных тестов, вы должны убедиться, что индекс обновляется перед выполнением каких-либо запросов (в том числе в счет). Для этого можно использовать Refresh API. (В других случаях считается анти-шаблоном для использования API Refresh, однако, поскольку ожидание интервала обновления обычно является наиболее эффективным способом индексирования документов.)

+1

Для записи недостающая строка после индексирования: ... '' client.admin() индексы() prepareRefresh() выполнение() actionGet();. '' –

Смежные вопросы