当前位置: 首页 > 知识库问答 >
问题:

spring数据弹性搜索和更新

狄宏大
2023-03-14

我正在使用spring数据elasticsearch来执行CRUD操作。

我有一个扩展Elasticsearch chRepository的自定义存储库。

最终,ElasticsearchRepository扩展了CrudRepository,这意味着可以更新现有记录。

问题是,你是如何做到这一点的?我还没有找到一个名为“update()”的方法

我认为做以下事情会有用(代码从https://github.com/BioMedCentralLtd/spring-data-elasticsearch-sample-application)

    //create
    Book book = new Book();
    book.setId("123455");
    book.setName("Spring Data Elasticsearch");
    book.setVersion(System.currentTimeMillis());
    repository.save(book);

    //update
    book.setName("THIS IS A COMPLETELY NEW TITLE");
    repository.save(book); 

但是,第二次保存会引发InvocationTargetException

使用调试器检查它显示:

[book][0] [book][123455]: version conflict, current [1447792071681], provided [1447792071681]

Book对象看起来像:

@Document(indexName = "book",type = "book" , shards = 1, replicas = 0, indexStoreType = "memory", refreshInterval = "-1")
public class Book {

    @Id
    private String id;
    private String name;
    private Long price;
    @Version
    private Long version;

    public Map<Integer, Collection<String>> getBuckets() {
        return buckets;
    }

    public void setBuckets(Map<Integer, Collection<String>> buckets) {
        this.buckets = buckets;
    }

    @Field(type = FieldType.Nested)
    private Map<Integer, Collection<String>> buckets = new HashMap();

    public Book(){}

    public Book(String id, String name,Long version) {
        this.id = id;
        this.name = name;
        this.version = version;
    }

    getters and setters removed for space

}

我的存储库代码更简单:

import org.springframework.data.elasticsearch.entities.Book;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

public interface BookRepository extends ElasticsearchRepository<Book, Long> {

}

我必须提供更新方法吗?

编辑:

没有关系。我将更新更改为:

    //update
    book.setName("THIS IS A COMPLETELY NEW TITLE");
    book.setVersion(System.currentTimeMillis());
    repository.save(book); 

它更新了记录。

共有3个答案

周越泽
2023-03-14

第二次更新失败,因为您正在尝试更新版本未更改的实体。您收到的错误消息是ES告诉您,“嘿,您不能两次保存相同的版本!”试试这个:

//create
Book book = new Book();
book.setId("123455");
book.setName("Spring Data Elasticsearch");
book.setVersion(System.currentTimeMillis());
repository.save(book);

//update
book.setName("THIS IS A COMPLETELY NEW TITLE");
book.setVersion(System.currentTimeMillis()); // you're saving a new version
repository.save(book); 
逑彬炳
2023-03-14

我更新了索引文档,代码段如下:

        IndexRequest indexRequest = new IndexRequest(INDEX_NAME,INDEX_NAME,docid);
        indexRequest.source(fldName, fldValue);
        UpdateRequest updateRequest = new UpdateRequest();
        updateRequest.index(INDEX_NAME);
        updateRequest.type(INDEX_NAME);
        updateRequest.id(docid);
        updateRequest.doc(indexRequest);
        try {
            UpdateResponse res=client.update(updateRequest).get();
            logger.info("update es {}:{}",fe,res.getGetResult());
        } catch (Exception e) {
            logger.error("update",e);
            throw e;
        }
方昊阳
2023-03-14

您可以使用UpdateQuery和ElasticSearchTemboard更新任何部分文档。例如

    final UpdateRequest updateRequest = new UpdateRequest();
    updateRequest.index(mainIndexName);
    updateRequest.type(typeName);
    updateRequest.id(id);
    updateRequest.doc(XContentFactory.jsonBuilder().startObject()
                        .field("accountType", accountType)
                        .endObject());
    final UpdateQuery updateQuery = new UpdateQueryBuilder().withId(id)
                        .withClass(<DocumentClass>).withUpdateRequest(updateRequest).build();
    UpdateResponse updateResponse =  elasticSearchTemplate.update(updateQuery);
 类似资料:
  • 升级到Spring boot 2.3和Spring data elasticsearch 4.0.9后的问题。我有这样的文档: 这在spring data 3.0中与Jackson配合得很好,但升级到4.0后,Jackson不再可用,现在我收到了一个来自spring的实例化异常,无法实例化URL对象。 例外情况: 任何关于解决方案的想法都将受到赞赏。

  • 我有一个设计糟糕的文档结构: 我想从上面的文档中检索标题、Fach和代码。 多谢了。

  • 我需要运行以下查询: 但我不能用spring data elasticsearch轻松运行这个。 有什么办法吗 spring data elasticsearch是否很好地支持所有elasticsearch查询DSL

  • 我正在尝试在多个集群(而不是节点)中插入记录。我正在使用spring-data-elastic search(版本2.0.4.version)。我尝试使用不同bean名称在配置中创建2个elasticsearchoperation实例。我正在尝试使用带有索引(IndexQuery IndexQuery)方法的对象进行插入。但当我尝试插入时,我无法保持字段的映射(非分析字段类型)。可以有人请帮助我如

  • 我正在尝试配置Spring数据引导和ES项目在我的pom.xml我有: } 在我的pom xml中,我有这个dep: 这应该提供驱动程序,但我不断得到:描述: 无法确定数据库类型 NONE 的嵌入式数据库驱动程序类 行动: 如果你想要一个嵌入式数据库,请在类路径上放置一个受支持的数据库。如果要从特定配置文件加载数据库设置,则可能需要激活它(当前没有配置文件处于活动状态)。

  • 我试图用Spring Boot和弹性搜索设置一个应用程序。这个应用程序已经使用Spring Data JPA存储库来持久化我的实体。当我试图在启用弹性搜索配置的情况下运行应用程序时,我遇到的问题是,当存储库被扫描时,我得到了一个异常。 我得到了以下例外: 我的存储库的定义如下: 异常似乎是由于count查询的签名导致的,该签名返回一个int。尽管这个存储库可以很好地处理JPA,但它会抛出一个异常,