2014-01-22 3 views
0
IndexResponse response = client.prepareIndex("face", "book","1") 
       .setSource(jsonBuilder() 
         .startObject() 
         .field("name", "kimchy") 
         .field("postDate", "2010-03-01") 
         .field("message", "trying out Elastic Search") 
         .endObject() 
       ) 
       .execute() 
       .actionGet(); 
String index = response.getIndex(); // index : "face" 

SearchResponse r = client.prepareSearch("face") 
    .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) 
    .setQuery(QueryBuilders.termQuery("name","kimchy")) 
    .setFrom(0).setSize(60).setExplain(true) 
    .execute() 
    .actionGet(); 
     System.out.println(r); 
     SearchHit[] hits = r.getHits().getHits(); 
     System.out.println(hits.length); // 0 Hits 
     for (SearchHit searchHit : hits) { 
     // no hits no data 
     } 

Как исправить это, где проблема? Мои попытки дают 0 ударов. Я пробовал все, но я не мог исправить. Я буду рад, если кто-нибудь поможет мне исправить этот код. Если я напишу prepareIndex («twitter», «tweet», «1») и client.prepareIndex («twitter», «tweet», «1») это дает мне некоторые результаты, но я думаю, что это результат по умолчанию. Я хочу найти конкретное слово, которое я хочу.Как я могу указать и искать с помощью Elasticsearch

ответ

0

Попробуйте добавить

.setRefresh(true) 

К вашему client.prepareIndex вызова

+0

Хотя это решение работает, это означает, что вы должны «обновлять» свои индексы вручную. Поскольку я уверен, что @mconlin знает, но не сказал, обновление вручную для целей тестирования прекрасное, но будет иметь влияние на производительность, если это будет сделано по каждому запросу. лучше позволить Elasticsearch делать это автоматически в фоновом режиме. – DrTech

1

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

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

Если вы добавляете обновление, вы можете либо вызвать обновление api, либо добавить флаг обновления в операцию индекса, чтобы обновление произошло после индексации документа. Просто помните, что это хорошая практика во время тестирования, но в процессе производства ваш код не должен вызывать обновление вручную, просто дайте автоматическое обновление в каждую секунду.

+0

Thnx для ответа он действительно работал. Значит, вы имели в виду Индексирование - Thread.sleep (60000) и Поиск работает отлично? Что такое неиспользуемая сторона ручного обновления? – user3077045

+0

Thread.sleep работает, но не настолько изящно ... недостатком ручного обновления является производительность, новый сегмент lucene очищается, если вы индексируете большое количество документов одновременно и обновляете после каждой операции индекса ... хорошо ваша пропускная способность будет сосать :) – javanna

+0

Это говорит, что обновление во время тестирования в порядке, в производстве просто пусть поиск будет близок к реальному времени, вот и все. – javanna

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