Использование Elastic4s для Percolator Queries

В настоящее время я пытаюсь создать перколятор с помощью Elastic4s. Я дошел до этого далеко, но я не могу найти какие-либо примеры, поэтому я не уверен, как это работает. Итак, у меня есть:

val percQuery = percolate in esIndex / esType query myQuery

esClient.execute(percQuery)

Каждый раз, когда он работает, он ничего не соответствует. Я понял, что мне нужно иметь возможность фильтровать Id, но я не могу найти никаких примеров того, как это сделать, даже в документах. Я знаю, что с Elastic4s создание запросов, отличных от запроса перколятора, позволяет вам указать поле идентификатора, например:

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 просто нужно что-то похожее на это, но в astic4s.

2 ответа

Итак, после гораздо большего исследования я выяснил, как это работает с astic4s. Чтобы сделать это в Elastic4s, вам фактически нужно использовать register вместо percolate, например так:

val percQuery = register id queryId into esIndex query myQuery

Это зарегистрирует запрос перколятора по идентификатору.

Итак, вы хотите добавить документ и вернуть запросы, ожидающие этого id быть добавленным? Это кажется странным использованием для percolate, так как это будет только одноразовое использование, поскольку только один документ может быть добавлен к идентификатору. В настоящее время вы не можете сделать фильтр по id в astic4s, и я не уверен, что вы сможете сделать это даже в самом asticsearch.

Это лучшая попытка, которую я могу придумать, когда у вас есть свое собственное поле "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)
}

Написано с использованием astic4s 1.7.4

Другие вопросы по тегам