Параметр ограничения размера соединителя эластичного поиска-искры игнорируется в запросе
Я пытаюсь запросить elasticsearch
с elasticsearch-spark
Разъем и я хочу вернуть только несколько результатов:
Например:
val conf = new SparkConf().set("es.nodes","localhost").set("es.index.auto.create", "true").setMaster("local")
val sparkContext = new SparkContext(conf)
val query = "{\"size\":1}"
println(sparkContext.esRDD("index_name/type", query).count())
Однако это вернет все документы в индексе.
3 ответа
Некоторые параметры фактически игнорируются в запросе, например: from
, size
, fields
, так далее.
Они используются внутри elasticsearch-spark
разъем.
К сожалению, этот список неподдерживаемых параметров не задокументирован. Но если вы хотите использовать size
параметр, на который вы всегда можете положиться pushdown
предикат и использовать DataFrame
/Dataset
limit
метод.
Таким образом, вы должны использовать Spark SQL DSL, например:
val df = sqlContext.read.format("org.elasticsearch.spark.sql")
.option("pushdown","true")
.load("index_name/doc_type")
.limit(10) // instead of size : 10
Этот запрос вернет первые 10 документов, возвращенных match_all
запрос, используемый по умолчанию соединителем.
Примечание: следующее не является правильным на любом уровне.
Это на самом деле специально. Поскольку соединитель выполняет параллельный запрос, он также проверяет количество возвращаемых документов, поэтому, если пользователь указывает параметр, он будет перезаписывать его в соответствии с настройкой es.scroll.limit (см. Параметр конфигурации).
Когда вы запрашиваете asticsearch, он также выполняет запрос параллельно на всех сегментах индекса, не перезаписывая их.
Если я правильно понимаю, вы выполняете операцию подсчета, которая не возвращает никаких документов. Вы ожидаете, что это вернется 1
потому что вы указали size: 1
? Этого не происходит, что по замыслу.
Отредактировано, чтобы добавить: это определение count()
в asticsearch-hadoop:
override def count(): Long = {
val repo = new RestRepository(esCfg)
try {
return repo.count(true)
} finally {
repo.close()
}
}
Он вообще не учитывает запрос, но рассматривает весь индекс ES как вход RDD.
Это на самом деле специально. Поскольку соединитель выполняет параллельный запрос, он также проверяет количество возвращаемых документов, поэтому, если пользователь указывает параметр, он будет перезаписывать его в соответствии с настройкой es.scroll.limit (см. Параметр конфигурации).
Другими словами, если вы хотите контролировать размер, сделайте это с помощью этого параметра, так как он всегда будет иметь приоритет.
Помните, что этот параметр применяется для каждого шарда. Таким образом, если у вас есть 5 осколков, вы можете делать ставки до ударов, если для этого параметра установлено значение 1.
См. https://www.elastic.co/guide/en/elasticsearch/hadoop/master/configuration.html