2015-08-27 2 views
1

Я написал программу, которая вставляет элемент, затем он ищет все элементы в хранилище. Таким образом, он находит еще один элемент при каждом запуске программы. Я ожидаю, что смогу прокомментировать вставку и по-прежнему запустить программу, просто найдя материал, который уже вставлен. Всякий раз, когда я это делаю, я получаю исключение «Не удалось выполнить фазу [query_fetch], все осколки не пройдены». Есть идеи?Как правильно инициализировать поиск Elicsearch?

Гипотеза: вставка элемента делает какую-то неявную инициализацию на моем узле. Тем не менее, я просматриваю источник ES, и я не могу понять, что это будет.

try (Node node = NodeBuilder.nodeBuilder().clusterName("tesssst").build().start()) { 
    try (Client client = node.client()) { 

     //insert an entry; if this part is removed, the program crashes 
     client.prepareIndex("movies", "movie", UUID.randomUUID().toString()).setSource(
      "{\"title\": \"Lawrence of Arabia\",\"director\": \"David Lean\",\"year\": 1962,\"genres\":" 
      + " [\"Adventure\", \"Biography\", \"Drama\"]}").execute().actionGet(); 

     //search all entries 
     System.out.println("***************"); 
     SearchResponse response = client.prepareSearch("movies") 
      .setTypes("movie") 
      .setSearchType(SearchType.QUERY_AND_FETCH) 
      .setFrom(0).setSize(60).setExplain(true) 
      .execute() 
      .actionGet(); 
     SearchHit[] results = response.getHits().getHits(); 
     System.out.println("Current results: " + results.length); 
     for (SearchHit hit : results) { 
      System.out.println("------------------------------"); 
      Map<String, Object> result = hit.getSource(); 
      System.out.println(result); 
     } 
     System.out.println("***************"); 

     client.close(); 
    } 
    node.close(); 
} 
+0

Можете ли вы показать мне распечатку вашего '_cluster/health'? Мне удалось воспроизвести это локально, и я хочу, чтобы убедиться, что моя догадка верна. – IanGabes

+0

Я добавил «System.out.println (client.admin(). Cluster(). PrepareHealth (« movies »). Get(). ToString()); перед поиском. – akroy

+0

Когда вставка произошло: "{ "CLUSTER_NAME": "tesssst", "статус": "желтый", "timed_out": ложные, "number_of_nodes": 1, "number_of_data_nodes": 1, " active_primary_shards ": 5, "active_shards": 5, "relocating_shards": 0, "initializing_shards": 0, "unassigned_shards": 5, "delayed_unassigned_shards": 0, "number_of_pending_tasks": 0, " number_of_in_flight_fetch ": 0 }" – akroy

ответ

1

Проблема заключалась в том, что у Elasticsearch не было достаточно времени для запуска, но исходная вставка дала ему достаточно времени. Просто добавив соответствующие ожидания фиксирует это:

final ClusterHealthRequest clusterHealthRequest = new ClusterHealthRequest("movies") 
     .timeout(TimeValue.timeValueSeconds(60)).waitForGreenStatus(); 
final ClusterHealthResponse clusterHealth = client.admin().cluster() 
     .health(clusterHealthRequest).actionGet(); 
if (clusterHealth.isTimedOut()) { 
    System.out.println("ElasticSearch cluster health timed out"); 
} else { 
    System.out.println("ElasticSearch cluster health: Status " 
      + clusterHealth.getStatus().name() + "; " + clusterHealth.getNumberOfNodes() 
      + " nodes; " + clusterHealth.getActiveShards() + " active shards."); 
} 

(если ваши стандарты ниже, вы можете сэкономить время с waitForYellowStatus)