Использование 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