2015-10-26 2 views
1

Я использую шутя, как ElasticSearch клиент для поиска документов:Клиент ElasticSearch Jest, как вернуть идентификатор документа из ударов?

JestClient client = ...; 
Search search = ...; 
SearchResult searchResult = client.execute(search); 
List<Hit<T, Void>> hits = searchResult.getHits(klass); 

Каждый Hit объект выглядит следующим образом:

{"_index":"some_index","_type":"some_type","_id":"some_id","_score":2.609438,"_source":{"foo1":"bar1","foo2":"bar2"}}

В то время как я могу найти только hit.source метод, кажется, не hit.id метод.

Проанализируйте его как объект JSON и получите ключ _id. Это способ, но есть ли какой-либо API, который может получить идентификатор документа?

+3

, если вы добавите идентификатор в класс Class, используя аннотацию '@ JestId', он должен отображаться непосредственно –

ответ

6

Просто FYI, искал же так взглянули на исходный код Jest и увидел, что Jest это заполнить hit.source.es_metadata_id с «_id», если она существует (см io.searchbox.core.SearchResult, строка 115)

так могли бы сделать что-то вроде следующих как альтернативы аннотации:

List<Hit<Map,Void>> hits = client.execute(search).getHits(Map.class) 
Hit hit = hits.get(0) 
Map source = (Map)hit.source 
String id = (String)source.get(JestResult.ES_METADATA_ID) 
4

Кажется, нет способа получить _id через Jest API, необходимо получить _id от _source.

Как @juliendangers упоминалось, добавить @JestId аннотаций можно достичь:

public class MyClass { 
    @JestId private String documentId; 
    private String foo; 
} 

И должен явно указать идентификатор документа: myClass.setDocumentId("some_id");

Hit Каждый объект выглядит следующим образом: {"_index":"some_index","_type":"some_type","_id":"some_id","_score":2.609438,"_source":{"foo":"bar","documentId":"some_id"}}

(если не явно установлен идентификатор документа, пара "documentId":"some_id" будет отсутствовать у Hit)

В то время как в соответствии с моим испытанием, если использовать наследование, должны явно установить родительского класса идентификатор документа:

public class ParentClass { 
    @JestId private String documentId; 
} 

public class MyClass extends ParentClass { 
    private String foo; 
    public MyClass() { 
     super.setDocumentId("some_id"); 
    } 
} 
Смежные вопросы