Scala: для получения более 10000 документов / сообщений от Elasticsearch - PullRequest
1 голос
/ 21 июня 2019

Я использую Scala 2.12, и у нас есть Elasticsearch 5.2.2. Мое требование - только выборка / поиск на основе критериев. Поиск вернет более 10000 документов или сообщений за один раз. Поэтому я не могу использовать обычный поиск. Данные (каждый документ / сообщение) представляют собой сложный JSON, который я могу позже проанализировать. Поэтому мне нужно получить все такие сообщения и сохранить их в одном списке Json или чего-то еще. Я не очень хорошо владею Scala. Я могу использовать Elastic4s в Scala для поиска. Я вижу, что у него есть опция прокрутки и сканирования, но я не нашел полноценного рабочего примера. Так что вам нужна помощь.

Я вижу некоторый пример кода, как показано ниже, но мне нужна дополнительная помощь, чтобы извлечь все и поместить все, как указано выше:

client.execute {
   search in "index" / "type" query <yourquery> scroll "1m"
}

client.execute {
   search scroll <id>
}

Но как получить идентификатор прокрутки и как получить все данные?


Обновление:

Версия Scala и версия ES упомянуты выше.

Я использую следующий пример:

SBT:

libraryDependencies += "com.sksamuel.elastic4s" %% "elastic4s-core" % "7.0.2"

libraryDependencies += "com.sksamuel.elastic4s" %% "elastic4s-http" % "5.5.10"

libraryDependencies += "com.sksamuel.elastic4s" %% "elastic4s-http-streams" % "6.5.1"

libraryDependencies += "org.elasticsearch" % "elasticsearch" % "5.6.0"

Код:

import com.sksamuel.elastic4s.ElasticsearchClientUri
import com.sksamuel.elastic4s.requests.common.RefreshPolicy
import com.sksamuel.elastic4s.http.{ElasticClient, ElasticProperties}
import com.sksamuel.elastic4s.http.Response
import com.sksamuel.elastic4s.http.search.SearchResponse
import com.sksamuel.elastic4s.HttpClient

import com.sksamuel.elastic4s.http.ElasticDsl._

val client = HttpClient(ElasticsearchClientUri("host", 9200))

val resp1 = client.execute {
     search("index")
       .matchQuery("key", "value")
       .scroll("1m")
       .limit(500)
   }.await.result

val resp2 = client.execute {
      searchScroll(resp1.scrollId.get).keepAlive(1.minute)
    }.await

Мне кажется, я не использую правильные версии для модулейastic4s.

Isuses:

  • import com.sksamuel.elastic4s.HttpClient: он не распознает класс HttpClient. Как показывает ошибка, HttpClient не найден при попытке инициализировать переменную client.

  • Далее, в моем resp2, когда я пытаюсь получить "scrollId", он не распознает это. Как получить scrollId от resp1?

В общем, чего здесь не хватает?

Обновление 2:

Я изменил версию приведенных ниже зависимостей в соответствии с примером на github (samples)

libraryDependencies += "com.sksamuel.elastic4s" %% "elastic4s-http" % "6.3.3"

Код:

val client = ElasticClient(ElasticProperties("http://host:9200"))

Теперь я получаю следующее сообщение об ошибке;

Ошибка:

Symbol 'type <none>.term.BuildableTermsQuery' is missing from the classpath.
[error] This symbol is required by 'method com.sksamuel.elastic4s.http.search.SearchHandlers.BuildableTermsNoOp'.
[error] Make sure that type BuildableTermsQuery is in your classpath and check for conflicting dependencies with `-Ylog-classpath`.
[error] A full rebuild may help if 'SearchHandlers.class' was compiled against an incompatible version of <none>.term.
[error]     val client = ElasticClient(ElasticProperties("host:9200"))
[error]                                                 ^
[error] one error found
[error] (compile:compileIncremental) Compilation failed
...