2013-11-16 3 views
3

Я пытаюсь начать использовать elasticsearch (будучи долгосрочным пользователем компаса), и у меня возникают довольно серьезные проблемы с основами, что очень расстраивает ,elasticsearch: Не удается найти индексированные данные (узел узла закрыт)

Текущая проблема, с которой я сталкиваюсь, заключается в том, что индексированные данные не отображаются до тех пор, пока узел не будет закрыт. Вот пример моего кода

Node node = nodeBuilder().node(); 
Client client = node.client(); 

client.prepareIndex("index1", "type1", "1").setSource("{ \"name\": \"Aaron\"}").execute().actionGet(); 
client.prepareIndex("index1", "type1", "2").setSource("{ \"name\": \"Andrew\"}").execute().actionGet(); 
client.prepareIndex("index1", "type1", "3").setSource("{ \"name\": \"Alistair\"}").execute().actionGet(); 

QueryBuilder queryBuilder = QueryBuilders.wildcardQuery("name", "a*"); 
SearchRequestBuilder searchRequestBuilder = client.prepareSearch("index1"); 
searchRequestBuilder.setTypes("type1"); 
searchRequestBuilder.setSearchType(SearchType.DEFAULT); 
searchRequestBuilder.setQuery(queryBuilder); 

SearchResponse response = searchRequestBuilder.execute().actionGet(); 
System.out.println("Response contains " + response.getHits().totalHits() + " hits"); 
for (SearchHit currentHit : response.getHits()) 
{ 
    System.out.println(currentHit.getSourceAsString()); 
} 

client.close(); 
node.close(); 

Первый раз, когда я запускаю это, он не находит никаких ударов в поиске. Однако, если я запустил его снова - он действительно найдет имена, которые начинаются с буквы «A» (не заставляйте меня начинать с автоматического понижения индексации предметов, но не от поисков, которые стоили мне больше часа).

Если я удаляю закрытие, не имеет значения, сколько раз я запускаю выше, я никогда не нахожу результатов. Однако, если я добавляю теги закрытия, он работает второй раз (каждый раз).

Чувствуется, что что-то связано с буферизацией изменений индекса, которые не покраснели?

Уверен, что у меня отсутствует что-то очевидное и основное. Но я просто не могу на нее наложить.

ответ

5

Вы хотите, чтобы refresh указатель, прежде чем вы сможете найти последние изменения. Поместите это после индексации, перед выполнением поиска:

client.admin().indices().prepareRefresh("index1").execute().actionGet(); 

С настройками по умолчанию, Elasticsearch будет вызывать refresh периодически 1 раз в секунду.

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