2016-09-20 15 views
0

私はElasticsearch、特にElasticsearchのJava APIに問題があります。弾性検索親フィールドは指定できません

私はそれぞれのJava APIの助けによって作成されたElasticsearchインスタンスを実行するPlayアプリケーションを持っています。アプリケーションの起動時に、Elasticsearchインデックスが作成されます。この索引は、ランタイム中のデータ処理に使用されます。 Macでアプリケーションをローカルに実行すると(Windowsでも動作します)、すべてがスムーズに動作しています。しかし、アプリケーションを仮想マシン(現在はUbuntuに、Windowsでも試しましたが)にデプロイするとすぐに、私は奇妙な問題に直面します。アプリケーションが起動し、Elasticsearchサーバーをセットアップし、インデックスを作成します(正しくはありません)。あなたに私は、関連するコードスニペットを付けるだけでなく、すぐに説明したいインデックスの構造についてのより良いアイデアを与えるために

java.lang.IllegalArgumentException: Can't specify parent if no parent field has been configured 
    at org.elasticsearch.action.index.IndexRequest.process(IndexRequest.java:617) 
    at org.elasticsearch.action.index.TransportIndexAction.resolveRequest(TransportIndexAction.java:131) 
    at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryPhase.checkBlocks(TransportReplicationAction.java:411) 
    at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryPhase.doRun(TransportReplicationAction.java:367) 
    at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37) 
    at org.elasticsearch.action.support.replication.TransportReplicationAction.doExecute(TransportReplicationAction.java:120) 
    at org.elasticsearch.action.index.TransportIndexAction.innerExecute(TransportIndexAction.java:135) 
    at org.elasticsearch.action.index.TransportIndexAction.doExecute(TransportIndexAction.java:119) 
    at org.elasticsearch.action.index.TransportIndexAction.doExecute(TransportIndexAction.java:66) 
    at org.elasticsearch.action.support.TransportAction.execute(TransportAction.java:70) 
    at org.elasticsearch.client.node.NodeClient.doExecute(NodeClient.java:58) 
    at org.elasticsearch.client.support.AbstractClient.execute(AbstractClient.java:347) 
    at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:85) 
    at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:59) 
    at org.elasticsearch.action.ActionRequestBuilder.get(ActionRequestBuilder.java:67) 
    at util.ElasticsearchServer.insert(ElasticsearchServer.java:83) 
    at models.Article.saveEntityElasticsearch(Article.java:349) 
    at models.Entity.saveEntity(Entity.java:26) 
    at controllers.ImportController.saveArticleContainers2AndArticles2(ImportController.java:119) 
    at controllers.ImportController.saveArticleContainers2AndArticles2(ImportController.java:116) 
    at controllers.ImportController.importGermanLaws(ImportController.java:100) 
    at Routes$$anonfun$routes$1$$anonfun$applyOrElse$47$$anonfun$apply$47.apply(routes_routing.scala:1060) 
    at Routes$$anonfun$routes$1$$anonfun$applyOrElse$47$$anonfun$apply$47.apply(routes_routing.scala:1060) 
    at play.core.Router$HandlerInvokerFactory$$anon$4.resultCall(Router.scala:264) 
    at play.core.Router$HandlerInvokerFactory$JavaActionInvokerFactory$$anon$15$$anon$1.invocation(Router.scala:255) 
    at play.core.j.JavaAction$$anon$1.call(JavaAction.scala:55) 
    at play.GlobalSettings$1.call(GlobalSettings.java:67) 
    at play.core.j.JavaAction$$anonfun$11.apply(JavaAction.scala:82) 
    at play.core.j.JavaAction$$anonfun$11.apply(JavaAction.scala:82) 
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24) 
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) 
    at play.core.j.HttpExecutionContext$$anon$2.run(HttpExecutionContext.scala:40) 
    at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:46) 
    at play.core.j.HttpExecutionContext.execute(HttpExecutionContext.scala:32) 
    at scala.concurrent.impl.Future$.apply(Future.scala:31) 
    at scala.concurrent.Future$.apply(Future.scala:485) 
    at play.core.j.JavaAction$class.apply(JavaAction.scala:82) 
    at play.core.Router$HandlerInvokerFactory$JavaActionInvokerFactory$$anon$15$$anon$1.apply(Router.scala:252) 
    at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4$$anonfun$apply$5.apply(Action.scala:130) 
    at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4$$anonfun$apply$5.apply(Action.scala:130) 
    at play.utils.Threads$.withContextClassLoader(Threads.scala:21) 
    at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4.apply(Action.scala:129) 
    at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4.apply(Action.scala:128) 
    at scala.Option.map(Option.scala:145) 
    at play.api.mvc.Action$$anonfun$apply$1.apply(Action.scala:128) 
    at play.api.mvc.Action$$anonfun$apply$1.apply(Action.scala:121) 
    at play.api.libs.iteratee.Iteratee$$anonfun$mapM$1.apply(Iteratee.scala:483) 
    at play.api.libs.iteratee.Iteratee$$anonfun$mapM$1.apply(Iteratee.scala:483) 
    at play.api.libs.iteratee.Iteratee$$anonfun$flatMapM$1.apply(Iteratee.scala:519) 
    at play.api.libs.iteratee.Iteratee$$anonfun$flatMapM$1.apply(Iteratee.scala:519) 
    at play.api.libs.iteratee.Iteratee$$anonfun$flatMap$1$$anonfun$apply$14.apply(Iteratee.scala:496) 
    at play.api.libs.iteratee.Iteratee$$anonfun$flatMap$1$$anonfun$apply$14.apply(Iteratee.scala:496) 
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24) 
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) 
    at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:41) 
    at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:393) 
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) 
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) 
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) 
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) 

:私は新しい文書を作成したい場合は今、私は次のエラーを受け取りますセットアップ。

私のトップエンティティはある種のドキュメントです。マッピングはかなりシンプルで、いくつかのフィールドがあります。次のエンティティは「ArticleContainer」です。無関係ないくつかのフィールドの他に、 "Law"という1つのフィールドがあります。このフィールドには、そのドキュメントのIDが含まれます。また、私は "記事"を持っています。他のフィールドの中で、Articleは "ArticleContainer"タイプの "_parent"フィールドを持ち、したがって "ArticleContainer"の子です。最後のエンティティは「注釈」です。これはやはり「記事」の子であり、したがって「記事」タイプのフィールド「_parent」を有する。ここで

は、インデックスを作成するコードです:

private static void createIndex() { 
    client.admin().indices().prepareCreate(indexName).execute().actionGet(); 

    String mappingArticle = null; 
    String mappingAnnotation = null; 
    String mappingArticleContainer = null; 
    try { 
     mappingArticle = XContentFactory.jsonBuilder().startObject().startObject(Article.SC_TYPE).startObject("_parent").field("type", ArticleContainer.SC_TYPE).endObject().startObject("_routing").field("required", true).endObject().startObject("properties").startObject("ArticleContent").field("type", "string").endObject().endObject().endObject().endObject().string(); 
     mappingAnnotation = XContentFactory.jsonBuilder().startObject().startObject(Annotation.SC_TYPE).startObject("_parent").field("type", Article.SC_TYPE).endObject().startObject("_routing").field("required", true).endObject().startObject("properties").startObject("feature").field("type", "nested").endObject().startObject("AnnotationType").field("type", "string").field("index", "not_analyzed").endObject().startObject("Content").field("type", "string").field("index", "not_analyzed").endObject().endObject().endObject().endObject().string(); 
     mappingArticleContainer = XContentFactory.jsonBuilder().startObject().startObject(ArticleContainer.SC_TYPE).startObject("properties").startObject("ParentArticleContainer").field("type", "string").field("index", "not_analyzed").endObject().startObject(Law.SC_TYPE).field("type", "string").field("index", "not_analyzed").endObject().startObject(DraftedDocument.SC_TYPE).field("type", "string").field("index", "not_analyzed").endObject().startObject(Patent.SC_TYPE).field("type", "string").field("index", "not_analyzed").endObject().endObject().endObject().endObject().string(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    client.admin().indices().preparePutMapping(indexName).setType(Annotation.SC_TYPE).setSource(mappingAnnotation).execute().actionGet(); 
    client.admin().indices().preparePutMapping(indexName).setType(Article.SC_TYPE).setSource(mappingArticle).execute().actionGet(); 
    client.admin().indices().preparePutMapping(indexName).setType(ArticleContainer.SC_TYPE).setSource(mappingArticleContainer).execute().actionGet(); 
} 

奇妙な部分は、私はちょうどPlayアプリケーションを実行すると、それはローカルで動作していることを、すでに述べたように、です。私は任意のヘルプやヒントをいただければと思いVM上の生産バージョンのために、私は

play dist 

と分布を構築し、

/var/lib/jenkins/jobs/MyApp/bin/myApp -Dhttp.port=3000 -Dhttp.address=0.0.0.0 -Dpidfile.path=/var/lib/jenkins/jobs/MyApp/myApp.pid -Dplay.crypto.secret=mysecret 

でそれを開始します!

答えて

0

だから、ここに述べた問題のように思える: In ElasticSearch(Nest), Can't specify parent if no parent field has been configured

今、あなたは

I have "Articles". Among other fields, an Article has a "_parent" field of type "ArticleContainer" and thus is a child of an "ArticleContainer"

は、あなたが「ArticleContainer」を作成する前に、あなたは「条」を作成しているあなたのコードを見て言いました。 「商品」の前に注文を交換して「ArticleContainer」を作成すると、正常に動作するはずです。

ローカルでの作業は?手動でテストするためのマッピングを作成している可能性があると思います。どのように再作成するかは問題ではありません。

ローカルマシンのインデックスを削除してから、プログラムを実行してください。同じエラーが表示されることがあります。

関連する問題