我确实遇到了Elasticsearch的问题,尤其是Elasticsearch的Java API。
我有一个运行Elasticsearch实例的Play应用程序,该实例是在相应Java API的帮助下创建的。启动应用程序后,将创建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”。除了一些不相关的领域,它还有一个叫做“法律”的领域。该字段包含其文档的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 :(得分:0)
所以这似乎是一个问题: In ElasticSearch(Nest), Can't specify parent if no parent field has been configured
现在你说
我有“文章”。在其他字段中,Article具有“ArticleContainer”类型的“_ parent”字段,因此是“ArticleContainer”的子项
在创建“ArticleContainer”之前,查看代码是否正在创建“文章”。如果你交换订单并在“文章”之前创建“ArticleContainer”,它应该可以正常工作。
至于在本地工作?我认为您之前可能已经创建了用于手动测试的映射,因此“重新创建”它的顺序无关紧要。
尝试删除本地计算机上的索引,然后运行程序。您可能会看到相同的错误。