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

弹性搜索java(spring)在索引中的问题

杨慎之
2023-03-14

我已经将弹性搜索1.7.1与spring应用程序集成在一起。我有一个cron作业,它在每次运行时更新弹性搜索的索引。我遵循了github上的各种示例代码来使其工作。首先,我为索引目的自动连接了ElasticSearchOperations:

@Autowired
private ElasticsearchOperations elasticsearchOperations;

然后以以下方式执行内部循环索引

for(int i=0;i<list.size();i++)
{
    CategoryProductSearch search = new CategoryProductSearch();
    // set data to fields
    System.out.println("BEFORE SAVING DATA");
    IndexQuery indexQuery =new      

    IndexQueryBuilder().withId(search.getId()).withObject(search).build();
    //indexQuery.setId(search.getId());
    //indexQuery.setObject(search);
    //elasticsearchOperations.createIndex(CategoryProductSearch.class);
    elasticsearchOperations.putMapping(CategoryProductSearch.class);
    elasticsearchOperations.index(indexQuery);
    elasticsearchOperations.refresh(CategoryProductSearch.class,true);

    System.out.println("SAVING DATA");
 }

当我第一次运行它时,它就像预期的那样工作。我已经在config文件夹中的elasticsearch.yml中将cluster重命名为“mycluster”。第一次运行后,我可以看到创建的文件夹。索引和搜索(在另一个文件中实现)工作很好。但有时代码会卡在下面提到的行并显示连续警告[Chase Stein]节点null不是集群簇的一部分[elasticsearch],忽略...

 elasticsearchOperations.putMapping(CategoryProductSearch.class);

然后在一段时间后抛出NonodeAvailableException。我读过关于这个问题的文章,上面说可能没有足够的磁盘空间供弹性搜索索引数据。我是一个新的Spring和第一次尝试弹性搜索。这是磁盘空间问题还是索引数据的方式有问题?另外,如果我手动从/data目录中删除“mycluster”文件夹并重新启动应用程序,它又可以正常工作了!

异常的堆栈跟踪为:

  org.elasticsearch.action.UnavailableShardsException: [mycluster][0]       

  Primary shard is not active or isn't assigned to a known node. Timeout:    

  [1m], request: index {[mycluster][categoryproductsearch][1], 

  source[{// Source string }]
at 
  org.elasticsearch.action.support.replication
  .TransportShardReplicationOperationAction$PrimaryPhase
  .retryBecauseUnavailable
  (TransportShardReplicationOperationAction.java:655)
at 
   org.elasticsearch.action.support.replication
  .TransportShardReplicationOperationAction$PrimaryPhase.doRun
  (TransportShardReplicationOperationAction.java:362)
at 

  org.elasticsearch.common.util.concurrent.AbstractRunnable.run
  (AbstractRunnable.java:36)
at 
   org.elasticsearch.action.support.replication.
   TransportShardReplicationOperationAction$PrimaryPhase$3.onTimeout
   (TransportShardReplicationOperationAction.java:515)
at  

 org.elasticsearch.cluster.ClusterStateObserver$ObserverClusterStateListener
 .onTimeout
 (ClusterStateObserver.java:231)
at    
     org.elasticsearch.cluster.service.
    InternalClusterService$NotifyTimeout.run
    (InternalClusterService.java:560)
at 
     java.util.concurrent.ThreadPoolExecutor.runWorker
     (ThreadPoolExecutor.java:1145)
at 
     java.util.concurrent.ThreadPoolExecutor$Worker.run
     (ThreadPoolExecutor.java:615)
at 
      java.lang.Thread.run(Thread.java:745)

共有1个答案

单于正业
2023-03-14

嗨,我从generator-jhipster-elasticsearch-reindexer获取了这段代码

@Transactional(readOnly = true)
@SuppressWarnings("unchecked")
private <T> void reindexForClass(Class<T> entityClass, JpaRepository<T, Long> jpaRepository,
                                                      ElasticsearchRepository<T, Long> elasticsearchRepository) {
    elasticsearchTemplate.deleteIndex(entityClass);
    try {
        elasticsearchTemplate.createIndex(entityClass);
    } catch (IndexAlreadyExistsException e) {
        // Do nothing. Index was already concurrently recreated by some other service.
    }
    elasticsearchTemplate.putMapping(entityClass);
    if (jpaRepository.count() > 0) {
        try {
            Method m = jpaRepository.getClass().getMethod("findAllWithEagerRelationships");
            elasticsearchRepository.save((List<T>) m.invoke(jpaRepository));
        } catch (Exception e) {
            elasticsearchRepository.save(jpaRepository.findAll());
        }
    }
    log.info("Elasticsearch: Indexed all rows for " + entityClass.getSimpleName());
}

正如您所看到的,首先删除了索引,然后重新创建了一个映射,我认为您的顺序是错误的,它导致了一些破碎的碎片。您可以访问localhost:9200上的弹性Rest API,并尝试使用get请求/_cat/indexes查看索引。

 类似资料:
  • 我有大量相同类型的实体,每个实体都有大量属性,并且我只有以下两种选择来存储它们: 将每个项存储在索引中并执行多索引搜索 将所有enties存储在单个索引中,并且只搜索1个索引。 一般而言,我想要一个时间复杂度之间的比较搜索“N”实体与“M”特征在上述每一种情况!

  • 我刚加入弹性搜索公司。而不知道如何在JSON请求中对索引和an类型发出正确的请求?(所以我不想像localhost:9200/myindex/mytype/_search那样在URL中使用索引和类型,而是向localhost:9200/_search发出JSON请求) 我试过这样的东西。但我得到的结果是'AAA'索引而不是'BBB'索引。如何只从bbb索引得到结果或者根本没有结果?

  • 我编写了一个reindex方法,可以执行以下操作: 它确实起到了作用,但我现在确定,仅仅删除然后创建一个索引是否有意义。如何改进此方法?

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

  • 当我运行curl-X GET“elastic01:9200/_cat/index?v”时,我观察到我的一个索引的健康值为红色 我检查了集群的运行状况,即使是红色的 如何将elasticsearch索引健康状态从红色变为绿色。

  • 我是弹性搜索新手,并且已经完成了类似mykong教程的基本教程 我对创建任何文档的一部分有疑问 创建操作示例插入包含 /mkyong/posts/1001和以下请求数据的新文档: 问题1:-ES是否会在上述文档的所有属性上创建反向索引,即默认情况下的标题/类别/已发布/作者,并提供全文搜索,还是需要明确提及? 问题2:-在上述示例中,我们已经有了唯一的\u id,即。如果我已经将其存储在DB中并生