1

我目前正在尝试使用 Elastic4s 创建过滤器查询。我已经了解了这么多,但我似乎找不到任何例子,所以我不确定这是如何工作的。所以我有:

val percQuery = percolate in esIndex / esType query myQuery

esClient.execute(percQuery)

每次运行它都不匹配任何东西。我发现我需要能够渗透到 Id 上,但我似乎找不到任何关于如何做到这一点的示例,甚至在文档中也找不到。我知道使用 Elastic4s 创建过滤器查询以外的查询可以让您指定一个 id 字段,例如:

val query = index into esIndex / esType source myDoc id 12345

我已经尝试过这种方式进行渗透,但它不喜欢 id 字段,有谁知道如何做到这一点?

我以前使用 Dispatch Http 来执行此操作,但我正试图摆脱它。之前,我这样做是为了提交过滤器查询:

url(s"$esUrl/.percolator/$queryId)
  .setContentType("application/json", "utf-8")
  .setBody(someJson)
  .POST

注意 queryId 只需要类似的东西,但在 elastic4s 中。

4

2 回答 2

0

所以你想添加一个文档并返回等待添加的查询id?这似乎是 percolate 的一种奇怪用途,因为它只能使用一次,因为每个 id 只能添加一个文档。您目前无法在 elastic4s 中对 id 进行渗透,我不确定您是否甚至可以在 elasticsearch 本身中执行此操作。

这是我能想到的最好的尝试,你有自己的“id”字段,它可以反映“正确的”_id字段。

object Test extends App {

  import ElasticDsl._
  val client = ElasticClient.local

  client.execute {
    create index "perc" mappings {
      "idtest" as(
        "id" typed StringType
        )
    }
  }.await

  client.execute {
    register id "a" into "perc" query {
      termQuery("id", "a")
    }
  }.await

  client.execute {
    register id "b" into "perc" query {
      termQuery("id", "b")
    }
  }.await

  val resp1 = client.execute {
    percolate in "perc/idtest" doc("id" -> "a")
  }.await

  // prints a
  println(resp1.getMatches.head.getId)

  val resp2 = client.execute {
    percolate in "perc/idtest" doc("id" -> "b")
  }.await

  // prints b
  println(resp2.getMatches.head.getId)
}

使用 elastic4s 1.7.4 编写

于 2015-12-22T08:19:27.067 回答
0

所以经过更多的研究后,我弄清楚了它是如何与 elastic4s 一起工作的。要在 Elastic4s 中执行此操作,您实际上必须使用register而不是percolate ,如下所示:

val percQuery = register id queryId into esIndex query myQuery

这将在 id 处注册一个过滤器查询。

于 2015-12-22T17:46:32.170 回答