5

我正在尝试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())

但是,这将返回索引中的所有文档。

4

3 回答 3

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

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

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

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

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

于 2017-02-04T14:45:50.753 回答
0

如果我理解正确,您正在执行一个不返回任何文档的计数操作。您是否期望它会1因为您指定而返回size: 1?这不会发生,这是设计使然。

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

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

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

于 2015-09-07T07:00:25.397 回答
-1

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

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

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

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

于 2016-12-29T12:25:50.083 回答