使用Elastic4s进行过滤器查询

时间:2015-12-21 22:32:31

标签: scala elastic4s elasticsearch-percolate

我目前正在尝试使用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

我已尝试过percolate这种方式,但它不喜欢id字段,有人知道如何做到这一点吗?

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

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

注意queryId只需要类似于弹性4的东西。

2 个答案:

答案 0 :(得分:0)

所以你想要添加一个文档并返回等待添加id的查询?对于percolate来说,这似乎是一个奇怪的用途,因为它只是一次性使用,因为每个id只能添加一个文档。你不能在elastic4s上做id目前的percolate,我不确定你是否甚至可以在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编写

答案 1 :(得分:0)

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

val percQuery = register id queryId into esIndex query myQuery

这将在id。

处注册一个过滤器查询