Я использую Scala 2.12, и у нас есть Elasticsearch 5.2.2. Мое требование касается только выборки/поиска на основе критериев. Поиск выдаст более 10 000 документов или сообщений за один раз. Поэтому я не могу использовать обычный поиск. Данные (каждый документ/сообщение) представляют собой сложный JSON, который я могу проанализировать позже. Поэтому мне нужно получить все такие сообщения и сохранить их в одном списке Json или что-то в этом роде. Я не очень хорошо владею Scala. Я могу использовать Elastic4s в Scala для поиска. Я вижу, что у него есть опция прокрутки и сканирования, но я не нашел полного рабочего примера. Так что ищите помощи.
Я вижу пример кода, как показано ниже, но мне нужна дополнительная помощь, чтобы получить все и разместить все, как указано выше:
client.execute {
search in "index" / "type" query <yourquery> scroll "1m"
}
client.execute {
search scroll <id>
}
Но как получить идентификатор прокрутки и как продолжить получение всех данных?
Обновление:
Версия scala и версия ES упомянуты выше.
Я использую следующий пример:
СБТ:
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
Я думаю, что не использую правильные версии для модулей elastic4s.
Исусы:
import com.sksamuel.elastic4s.HttpClient: он не распознает класс HttpClient. Поскольку он показывает ошибку HttpClient not found, когда я пытаюсь инициализировать переменную «клиент».
Далее, в моем resp2, когда я пытаюсь получить «scrollId», он не распознает это. Как получить scrollId из resp1?
В общем, чего здесь не хватает?
Обновление 2:
Я изменил версию приведенных ниже зависимостей в соответствии с примером на github (примеры)
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