仅在 Play 中将 EBean 与 ElasticSearch 结合使用

Use EBean with ElasticSearch only in Play

我在 Play 中使用 Java,我试图让 EBean 只与 elasticsearch 一起工作。我不需要也不想要数据库连接,因为我不打算将我的数据存储在数据库中,只存储在 elasticsearch 中。

这是我的 application.conf

ebean.docstoreonly=true
ebean.docstore.url="http://dockermachine:9200"
ebean.docstore.active=true
ebean.docstore.generateMapping=true
ebean.docstore.dropCreate=true

不幸的是,当我 运行 项目时出现以下错误:

[error] java.lang.RuntimeException: com.typesafe.config.ConfigException$WrongType: conf\application.conf: 33: docstoreonly has type BOOLEAN rather than LIST
[error]     at com.typesafe.config.impl.SimpleConfig.findKeyOrNull(SimpleConfig.java:163)
[error]     at com.typesafe.config.impl.SimpleConfig.findOrNull(SimpleConfig.java:174)
[error]     at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:188)
[error]     at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:193)
[error]     at com.typesafe.config.impl.SimpleConfig.getList(SimpleConfig.java:262)
[error]     at com.typesafe.config.impl.SimpleConfig.getHomogeneousUnwrappedList(SimpleConfig.java:348)
[error]     at com.typesafe.config.impl.SimpleConfig.getStringList(SimpleConfig.java:406)
[error]     at play.db.ebean.EbeanParsedConfig.lambda$parseFromConfig(EbeanParsedConfig.java:72)
[error]     at java.util.Map.forEach(Map.java:630)
[error]     at play.db.ebean.EbeanParsedConfig.parseFromConfig(EbeanParsedConfig.java:66)
[error]     at play.db.ebean.EbeanParsedConfig.parseFromConfig(EbeanParsedConfig.java:47)
[error]     at play.db.ebean.ModelsConfigLoader.apply(ModelsConfigLoader.java:28)
[error]     at play.db.ebean.ModelsConfigLoader.apply(ModelsConfigLoader.java:21)
[error]     at play.ebean.sbt.PlayEbean$.$anonfun$configuredEbeanModels(PlayEbean.scala:153)
[error]     at play.ebean.sbt.PlayEbean$.withClassLoader(PlayEbean.scala:130)
[error]     at play.ebean.sbt.PlayEbean$.$anonfun$configuredEbeanModels(PlayEbean.scala:150)
[error]     at scala.Function1.$anonfun$compose(Function1.scala:44)
[error]     at sbt.internal.util.$tilde$greater.$anonfun$$u2219(TypeFunctions.scala:39)
[error]     at sbt.std.Transform$$anon.work(System.scala:66)
[error]     at sbt.Execute.$anonfun$submit(Execute.scala:262)
[error]     at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:16)
[error]     at sbt.Execute.work(Execute.scala:271)
[error]     at sbt.Execute.$anonfun$submit(Execute.scala:262)
[error]     at sbt.ConcurrentRestrictions$$anon.$anonfun$submitValid(ConcurrentRestrictions.scala:174)
[error]     at sbt.CompletionService$$anon.call(CompletionService.scala:36)
[error]     at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266)
[error]     at java.util.concurrent.FutureTask.run(FutureTask.java)
[error]     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
[error]     at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266)
[error]     at java.util.concurrent.FutureTask.run(FutureTask.java)
[error]     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
[error]     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
[error]     at java.lang.Thread.run(Thread.java:748)
[error] java.lang.RuntimeException: com.typesafe.config.ConfigException$WrongType: conf\application.conf: 33: docstoreonly has type BOOLEAN rather than LIST
[error]     at com.typesafe.config.impl.SimpleConfig.findKeyOrNull(SimpleConfig.java:163)
[error]     at com.typesafe.config.impl.SimpleConfig.findOrNull(SimpleConfig.java:174)
[error]     at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:188)
[error]     at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:193)
[error]     at com.typesafe.config.impl.SimpleConfig.getList(SimpleConfig.java:262)
[error]     at com.typesafe.config.impl.SimpleConfig.getHomogeneousUnwrappedList(SimpleConfig.java:348)
[error]     at com.typesafe.config.impl.SimpleConfig.getStringList(SimpleConfig.java:406)
[error]     at play.db.ebean.EbeanParsedConfig.lambda$parseFromConfig(EbeanParsedConfig.java:72)
[error]     at java.util.Map.forEach(Map.java:630)
[error]     at play.db.ebean.EbeanParsedConfig.parseFromConfig(EbeanParsedConfig.java:66)
[error]     at play.db.ebean.EbeanParsedConfig.parseFromConfig(EbeanParsedConfig.java:47)
[error]     at play.db.ebean.ModelsConfigLoader.apply(ModelsConfigLoader.java:28)
[error]     at play.db.ebean.ModelsConfigLoader.apply(ModelsConfigLoader.java:21)
[error]     at play.ebean.sbt.PlayEbean$.$anonfun$configuredEbeanModels(PlayEbean.scala:153)
[error]     at play.ebean.sbt.PlayEbean$.withClassLoader(PlayEbean.scala:130)
[error]     at play.ebean.sbt.PlayEbean$.$anonfun$configuredEbeanModels(PlayEbean.scala:150)
[error]     at scala.Function1.$anonfun$compose(Function1.scala:44)
[error]     at sbt.internal.util.$tilde$greater.$anonfun$$u2219(TypeFunctions.scala:39)
[error]     at sbt.std.Transform$$anon.work(System.scala:66)
[error]     at sbt.Execute.$anonfun$submit(Execute.scala:262)
[error]     at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:16)
[error]     at sbt.Execute.work(Execute.scala:271)
[error]     at sbt.Execute.$anonfun$submit(Execute.scala:262)
[error]     at sbt.ConcurrentRestrictions$$anon.$anonfun$submitValid(ConcurrentRestrictions.scala:174)
[error]     at sbt.CompletionService$$anon.call(CompletionService.scala:36)
[error]     at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266)
[error]     at java.util.concurrent.FutureTask.run(FutureTask.java)
[error]     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
[error]     at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266)
[error]     at java.util.concurrent.FutureTask.run(FutureTask.java)
[error]     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
[error]     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
[error]     at java.lang.Thread.run(Thread.java:748)
[error] (module1 / Compile / playEbeanModels) com.typesafe.config.ConfigException$WrongType: conf\application.conf: 33: docstoreonly has type BOOLEAN rather than LIST
[error] (module2 / Compile / playEbeanModels) com.typesafe.config.ConfigException$WrongType: conf\application.conf: 33: docstoreonly has type BOOLEAN rather than LIST
[error] Total time: 4 s, completed Apr 23, 2018 5:06:00 PM

我正在按照 github 上的示例进行操作:https://github.com/ebean-orm-examples/example-elasticsearch-only 上面说 ebean.docstoreonly 应该设置为true,但是好像需要List。 我正在使用 sbt-play-ebean 插件

addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "4.1.0")

内部使用 EBean 版本 11。7.x

我的 build.sbt 依赖于这个 ebean-elastic 组件:

 "io.ebean" % "ebean-elastic" % "11.15.1"

是否可以在 EBean 中仅使用 elasticsearch,或者我应该使用其他方法,例如 elasticsearch 官方 java sdk?

经过长时间的反复试验,这里是解决方案:

看来application.conf不是我应该存放ebean属性的地方。它应该是一个单独的文件,位于 application.conf 所在的同一目录中。

文件应命名为 ebean.properties:

ebean.elasticsearch.docStoreOnly=true
ebean.elasticsearch.docstore.url=http://dockermachine:9200
ebean.elasticsearch.docstore.active=true
ebean.elasticsearch.docstore.generateMapping=true
ebean.elasticsearch.docstore.dropCreate=true
ebean.elasticsearch.docstore.pathToResources=conf

这里有几点需要注意:

  1. 据我了解,ebean.properties 在这里是必需的,因为 application.conf 无法解释它未知的 key/value 对,并且将默认为 LIST。这应该是 sbt-play-ebean plugin for play 的工作,但似乎该插件已过时(有人可能会给我更好的解释)
  2. ebean.docstoreonly 是错误的。这是它的正确大小写:ebean.docStoreOnly.
  3. 如果您没有创建适当的文件夹,将不会创建生成的映射 json 文件。默认情况下,ebean 生成映射文件到 src/main/resources。这将在 Maven 构建中工作,但需要进入项目(或子模块)的 /conf 文件夹中的 sbt 构建工具和播放框架。这就是为什么我需要覆盖 ebean.elasticsearch.docstore.pathToResources
  4. sbt 也需要 H2 依赖(如果你还没有):"com.h2database" % "h2" % "1.4.196"。不知道为什么(因为我没有任何支持数据库),但我收到了 ClassNotFoundExceptions。
  5. 我从事的项目是特定的,我只需要 elasticsearch 上的一些数据,而只需要实际数据库上的一些数据。 Ebean-elastic 被设计为存储在数据库中的模型的支持索引。如果你启用 docStoreOnly 然后 ebean 将不再在实际数据库中进行任何写入。为了让它工作,你需要创建两个 ebean 服务器:一个只连接到数据库,一个只与 elasticsearch 通信。在我的例子中,默认的 ebeanserver 仅用于数据库连接(那里没有进行任何更改),我默认访问它:EbeanServer db = Ebean.getDefaultServer();。仅对于 elasticsearch,我必须配置单独的 ebeanserver。这就是为什么在 ebean.properties 中我在 ebean 和其他配置设置之间有 elasticsearch(ebean 服务器的名称)。所以基本上,ebean.properties 定义了名为 elasticsearch 的新 ebean 服务器。除此之外没有其他配置要求。在代码内部,我只使用 elasticsearch 这样的 ebean 服务器:EbeanServer dbes = Ebean.getServer("elasticsearch");