2016-09-01 2 views
0

я могу использовать preference для запроса ES осколка # 2 для чирикать документа с идентификатором 1 с URL, как это:Как запросить конкретный осколок для документа

GET twitter/tweet/1/_search?preference=_shards:2 

Как я могу сделать это с помощью Java API?

EDIT Это:

GET /bookshop/book/_search?preference=_shards:0 

перечисляет документ, а как ниже возвращает NPE:

GET /bookshop/book/id1?preference=_shards:0 //NPE 

и

GetResponse getResponse = client() 
      .prepareGet(BOOK_INDEX_NAME, BOOK_TYPE_NAME, "id1") 
      .setPreference("_shards:0") 
      .execute().actionGet(); 

    System.out.print(getResponse.getSource()); //HERE IS WHERE I GET THE NPE 

EDIT 2:

Почему же тогда, если у меня есть только два осколка для этого показателя для

GET /bookshop/book/id1?preference=_shards:0 

я NPE и

> GET /bookshop/book/id1?preference=_shards:1 

я "нашел ложь":

{ 
    "_index": "bookshop", 
    "_type": "book", 
    "_id": "id1", 
    "found": false 
} 

и

GET /bookshop/book/_search?preference=_shards:0 

получает фактический документ с id1 и полным _source?

{ 
    "took": 2, 
    "timed_out": false, 
    "_shards": { 
     "total": 1, 
     "successful": 1, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 1, 
     "max_score": 1, 
     "hits": [ 
     { 
      "_index": "bookshop", 
      "_type": "book", 
      "_id": "id1", 
      "_score": 1, 
      "_routing": "route1", 
      "_source": { 
       "title": "Clean COde", 
       "author": "John Smith" 
      } 
     } 
     ] 
    } 
} 

EDIT3: Для:

GET /bookshop/book/id1?preference=_shards:0 

я получаю следующее Быстродействие

{ 
    "error": { 
     "root_cause": [ 
     { 
      "type": "remote_transport_exception", 
      "reason": "[master-1][127.0.0.1:9304][indices:data/read/get[s]]" 
     } 
     ], 
     "type": "null_pointer_exception", 
     "reason": null 
    }, 
    "status": 500 
} 
+0

Вы уверены, что нашли свой URL? Вы ссылаетесь на один документ (с id = 1) или вы хотите запустить поиск (например, '/ _search')? Вы не можете обойти оба. – Val

+0

Я бы хотел найти один осколок для документа 'tweet' с заданным идентификатором. Это выполнимо? – mCs

+0

Вам нужно удалить конечную точку '_search'. Я изменил свой ответ – Val

ответ

2

Вы можете сделать это так, используя setPreference() вызов:

response = client() 
    .prepareGet("twitter", "tweet", "1") 
    .setRouting("route1") 
    .setPreference("_shards:2") 
    .execute().actionGet(); 
+0

Спасибо, это то, что я искал :) Упрощенный и принятый – mCs

+0

hmm с 'GET/twitter/tweet/_search? Preference = _shards: 2 Я получаю документацию, но когда я пытаюсь запустите 'response.getSource()'. Я получаю NPE. В чем проблема? – mCs

+0

Вы выполняете поиск вместо получения документа? Обновите свой вопрос с помощью точного кода Java, который вы используете. – Val

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