在查询中忽略elasticsearch-spark连接器大小限制参数

时间:2015-08-12 14:37:53

标签: scala elasticsearch apache-spark elasticsearch-hadoop

我正在尝试使用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 个答案:

答案 0 :(得分:0)

如果我理解正确,您正在执行计数操作,该操作不会返回任何文档。您是否希望它返回1,因为您指定了size: 1?这种情况并没有发生,这是设计上的。

编辑添加: 这是elasticsearch-hadoop中count()的定义:

override def count(): Long = {
    val repo = new RestRepository(esCfg)
    try {
      return repo.count(true)
    } finally {
      repo.close()
    }
  }

根本不考虑查询,但将整个ES索引视为RDD输入。

答案 1 :(得分:0)

实际上,设计会忽略某些参数,例如:fromsizefields等。

它们在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

此查询将返回连接器默认使用的match_all查询返回的前10个文档。

注意:以下内容在任何级别都不正确。

  

这实际上是故意的。由于连接器执行并行查询,因此它还会查看返回的文档数,因此如果用户指定参数,它将根据es.scroll.limit设置覆盖它(请参阅配置选项)。

当您查询elasticsearch时,它还会在所有索引分片上并行运行查询,而不会覆盖它们。

答案 2 :(得分:-1)

这实际上是故意的。由于连接器执行并行查询,因此它还会查看返回的文档数,因此如果用户指定参数,它将根据es.scroll.limit设置覆盖它(请参阅配置选项)。

换句话说,如果您想控制大小,请通过该设置执行此操作,因为它始终优先。

请注意,此参数适用于每个分片。因此,如果您有5个分片,如果此参数设置为1,您可能会下注次数。

请参阅https://www.elastic.co/guide/en/elasticsearch/hadoop/master/configuration.html