2

设置源和设置使用Java API的唯一方法是使用这样的代码(这是一个简单的测试类只有一个@Test法):没有办法来创建设置和源的Java API指数

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringBootTest 

@TestPropertySource(value = "classpath:testApplication.properties") 
public class ESJavaAPITests { 


    @Value("${ES.cluster.name}") 
    private String CLUSTER_NAME; 

    @Value("${ES.host}") 
    private String HOSTNAME; 

    @Value("${ES.port}") 
    private Integer HOST_PORT; 

    private static final String BOOK_INDEX_NAME ="bookshop"; 
    private static final String BOOK_TYPE_NAME ="book"; 

    private Client client(){ 
     Settings settings = Settings.settingsBuilder() 
       .put("cluster.name", CLUSTER_NAME) 
       .build(); 

     return new TransportClient.Builder().settings(settings).build() 
       .addTransportAddress(
         new InetSocketTransportAddress(
           new InetSocketAddress(HOSTNAME, HOST_PORT)) 
       ); 

    } 

    @Test 
    public void shouldSaveDocToPredefinedShard() throws IOException { 
     //delete all indexes if any 
     client().admin().indices().prepareDelete("_all").get(); 


     CreateIndexResponse createIndexRequestBuilder = client().admin().indices() 
       .prepareCreate(BOOK_INDEX_NAME) 
       .setSettings(
         Settings.settingsBuilder() 
           .put("index.number_of_shards", 2) 
           .put("index.number_of_replicas", 2) 
       ) 
       .execute() 
       .actionGet(); 

     IndexResponse response1 = client().prepareIndex(BOOK_INDEX_NAME, BOOK_TYPE_NAME, "id1") 
       .setSource(XContentFactory.jsonBuilder() 
         .startObject() 
          .field("title", "Clean COde") 
          .field("author", "John Smith") 
         .endObject() 
       ) 
       .setRouting("route1") 
       .get(); 

     IndexResponse response2 = client().prepareIndex(BOOK_INDEX_NAME, BOOK_TYPE_NAME, "id2") 
       .setSource(XContentFactory.jsonBuilder() 
         .startObject() 
          .field("title", "Learn Scala") 
          .field("author", "John Doe") 
         .endObject() 
       ) 
       .setRouting("route2") 
       .get(); 
    } 
} 

这个工程,当我第一次运行它。但是,当我运行它的第二次我得到:

java.lang.IllegalStateException:无法加载ApplicationContext的

在 org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate。的java:124) 在 org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:83) 在 org.springframework.boot.test.autoconfigure.AutoConfigureReportTestExecutionListener.prepareTestInstance(AutoConfigureReportTestExecutionListener.java:49) 在 org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:230) 在 org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:228)在 org.springframework。 test.context.junit4.SpringJUnit4ClassRunner $ 1.runReflectiveCall(SpringJUnit4ClassRunner.java:287) 在 org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 在 org.springframework.test.context .junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:289) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:247) 在 org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94) 处 org.junit.runners org.junit.runners.ParentRunner $ 3.run(ParentRunner.java:290)。 ParentRunner $ 1.schedule(ParentRunner.java:71)at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)at org.junit.runners.ParentRunner.access $ 000(ParentRunner.java:58)at org.junit.runners.ParentRunner $ 2.evaluate(ParentRunner.java:268)在 org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 在 org.springframework.test。 context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallba cks.java:70) 在org.junit.runners.ParentRunner.run(ParentRunner.java:363)在 org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191) 在有机junit.runner.JUnitCore.run(JUnitCore.java:137)在 com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:117) 在 com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter的.java:234) 在 com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)在 sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) a t sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498)at com.intellij.rt.execution.application.AppMain.main( AppMain.java:144) 引起者: org.springframework.beans.factory。UnsatisfiedDependencyException: 创建名为'bookServiceImpl'的Bean时出错:不满意 通过方法'setBookRepository'参数表示的依赖关系0: 创建名为'bookRepository'的bean时出错:初始化的调用 方法失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:失败 实例化 [org.springframework.data.elasticsearch.repository.support.SimpleElasticsearchRepository]: 构造函数抛出异常;嵌套异常是 java.lang.IllegalArgumentException:Mapper for [title]与 存在冲突,其他类型存在:[mapper [title]有不同的[store] values];嵌套的异常是 org.springframework.beans.factory.BeanCreationException:错误 创建名为'bookRepository'的bean:调用init方法 失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:失败 实例化 [org.springframework.data.elasticsearch.repository.support.SimpleElasticsearchRepository]: 构造函数抛出异常;嵌套的异常是 java.lang.IllegalArgumentException异常:映射器为[标题]与其它类型的 现有映射冲突:在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor [映射器[标题]具有不同[存储] 值] $ AutowiredMethodElement.inject

为什么这似乎是一个问题,当我第二次运行这个?

如何创建索引,并添加使用两个示范文件:

  1. 碎片NR
  2. 副本NR
  3. 指数名称
  4. 指数型
  5. 新的文件编号。

    与Java API?


回答

0

有没有足够代码在这里轻松地解释这个问题,但你有一个仓储类的地方叫做“bookRepository”很可能成立:自动配置。版本库不会被删除,因此,当您第二次重新创建索引时(第二次运行),它会比较“book”类(假设)与现有ES索引的模式 - 并且可能会“已对标题字段进行了更改。

您可能最好是手动清除书籍索引(我假设它并不重要,因为您在上面的代码中有一个删除),并且看到连续两次运行应用程序(您的测试用例)仍然失败。

相关问题