Springdata elasticsearch переназначает поле идентификатора на _id

В java у меня есть доменный класс Foo. У него есть поле id. Springdata автоматически сопоставляет это поле с полем «id», а не «_id» из-за его имени. Есть ли способ переназначить этот идентификатор в поле _id?

public class Foo  {
    @Id
    @Field(type = FieldType.String, store = true)
    private String id;
}

Поэтому, когда я делаю findById(String id), поиск будет использовать поле id в объекте домена, а не _id, сгенерированный эластичным поиском.

Я попытался создать метод с именем: findBy_Id (идентификатор строки), но библиотека данных Spring будет жаловаться, что это поле не существует в модели. Я не хотел переименовывать свойство id во всех своих объектах в _id, чтобы заставить это работать.


person user1099123    schedule 05.12.2014    source источник
comment
Что вы имеете в виду, говоря, что Springdata автоматически сопоставляет это поле с идентификатором поля, а не с _id из-за его имени? С кодом, который у вас есть, elasticsearch создаст документ со следующей схемой, которая содержит поля _id и id. _id является частью схемы ES по умолчанию, и ее значение берется из поля id класса Foo. { _index: тест, _type: тест, _id: 323455, _score: 1, _source: {id: 323455}}   -  person Nitin Arora    schedule 06.12.2014
comment
отредактировал мой оригинальный пост.   -  person user1099123    schedule 08.12.2014


Ответы (1)


Измените определение класса Foo, чтобы задать имя индекса и параметры типа.

@Document(indexName = "foo",type = "foo")
public class Foo  {
    @Id
    @Field(type = FieldType.String, store = true)
    private String id;
}

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

public interface FooRepository extends ElasticsearchRepository<Foo,String> {

}

Вы должны использовать метод save для индексации объекта Foo в elasticsearch.

Foo objFoo = new Foo();
objFoo.setId("123");

objFooRepository.save(objFoo);

Эластичный поиск проиндексирует документ objFoo, создав новый индекс с именем foo и типом foo.

{
    "_index": "foo",
    "_type": "foo",
    "_id": "123",
    "_score": 1,
    "_version": 1,
    "_source": {
        "id": "123"
    }
}

Используйте метод findOne() репозитория для получения проиндексированного документа.

Foo indexedFoo = repository.findOne(objFoo.getId());
person Nitin Arora    schedule 06.12.2014