Поля пусты при выполнении GET в astic4s
Я пытаюсь внедрить сервис в своем приложении play2, который использует эластичные файлы для получения документа по идентификатору.
Мой документ в asticsearch:
curl -XGET 'http://localhost:9200/test/venues/3659653'
{
"_index": "test",
"_type": "venues",
"_id": "3659653",
"_version": 1,
"found": true,
"_source": {
"id": 3659653,
"name": "Salong Anna och Jag",
"description": "",
"telephoneNumber": "0811111",
"postalCode": "16440",
"streetAddress": "Kistagången 12",
"city": "Kista",
"lastReview": null,
"location": {
"lat": 59.4045675,
"lon": 17.9502138
},
"pictures": [],
"employees": [],
"reviews": [],
"strongTags": [
"skönhet ",
"skönhet ",
"skönhetssalong"
],
"weakTags": [
"Frisörsalong",
"Frisörer"
],
"reviewCount": 0,
"averageGrade": 0,
"roundedGrade": 0,
"recoScore": 0
}
}
Мой сервис:
@Singleton
class VenueSearchService extends ElasticSearchService[IndexableVenue] {
/**
* Elastic search conf
*/
override def path = "test/venues"
def getVenue(companyId: String) = {
val resp = client.execute(
get id companyId from path
).map { response =>
// transform response to IndexableVenue
response
}
resp
}
Если я использую getFields() для объекта ответа, я получаю пустой объект. Но если я вызываю response.getSourceAsString, я получаю документ как json:
{
"id": 3659653,
"name": "Salong Anna och Jag ",
"description": "",
"telephoneNumber": "0811111",
"postalCode": "16440",
"streetAddress": "Kistagången 12",
"city": "Kista",
"lastReview": null,
"location": {
"lat": 59.4045675,
"lon": 17.9502138
},
"pictures": [],
"employees": [],
"reviews": [],
"strongTags": [
"skönhet ",
"skönhet ",
"skönhetssalong"
],
"weakTags": [
"Frisörsalong",
"Frisörer"
],
"reviewCount": 0,
"averageGrade": 0,
"roundedGrade": 0,
"recoScore": 0
}
Как вы можете видеть, запрос get опускает информацию:
"_index": "test",
"_type": "venues",
"_id": "3659653",
"_version": 1,
"found": true,
"_source": {}
Если я попытаюсь сделать обычный поиск:
def getVenue(companyId: String) = {
val resp = client.execute(
search in "test"->"venues" query s"id:${companyId}"
//get id companyId from path
).map { response =>
Logger.info("response: "+response.toString)
}
resp
}
Я получил:
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "test",
"_type": "venues",
"_id": "3659653",
"_score": 1,
"_source": {
"id": 3659653,
"name": "Salong Anna och Jag ",
"description": "",
"telephoneNumber": "0811111",
"postalCode": "16440",
"streetAddress": "Kistagången 12",
"city": "Kista",
"lastReview": null,
"location": {
"lat": 59.4045675,
"lon": 17.9502138
},
"pictures": [],
"employees": [],
"reviews": [],
"strongTags": [
"skönhet ",
"skönhet ",
"skönhetssalong"
],
"weakTags": [
"Frisörsalong",
"Frisörer"
],
"reviewCount": 0,
"averageGrade": 0,
"roundedGrade": 0,
"recoScore": 0
}
}
]
}
}
Мой индексный сервис:
trait ElasticIndexService [T <: ElasticDocument] {
val clientProvider: ElasticClientProvider
def path: String
def indexInto[T](document: T, id: String)(implicit writes: Writes[T]) : Future[IndexResponse] = {
Logger.debug(s"indexing into $path document: $document")
clientProvider.getClient.execute {
index into path doc JsonSource(document) id id
}
}
}
case class JsonSource[T](document: T)(implicit writes: Writes[T]) extends DocumentSource {
def json: String = {
val js = Json.toJson(document)
Json.stringify(js)
}
}
и индексация:
@Singleton
class VenueIndexService @Inject()(
stuff...) extends ElasticIndexService[IndexableVenue] {
def indexVenue(indexableVenue: IndexableVenue) = {
indexInto(indexableVenue, s"${indexableVenue.id.get}")
}
- Почему getFields пусто при выполнении get?
- Почему информация запроса не учитывается при выполнении getSourceAsString в запросе get?
Спасибо!
2 ответа
В вопросе 1 вы сталкиваетесь с тем, что вы не указываете, какие поля возвращать. По умолчанию ES возвращает источник, а не поля (кроме type и _id). См. http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-fields.html
Я добавил тест в astic4s, чтобы показать, как получать поля, см. https://github.com/sksamuel/elastic4s/blob/master/src%2Ftest%2Fscala%2Fcom%2Fsksamuel%2Felastic4s%2FSearchTest.scala
Я не уверен в вопросе 2.
Поля пусты, потому что упорный поиск не возвращает. Если вам нужны поля, вы должны указать в запросе, какое поле вам нужно:
это ваш поисковый запрос без поля:
search in "test"->"venues" query s"id:${companyId}"
и в этом запросе мы указываем, какое поле мы хотим, в данном случае "имя" и "описание":
search in "test"->"venues" fields ("name","description") query s"id:${companyId}"
Теперь вы можете получить поля:
for(x <- response.getHits.hits())
{
println(x.getFields.get("name").getValue)
Вы нашли getSourceAsString в запросе get, поскольку для параметра _source по умолчанию установлено значение "on", а для полей установлено значение "off" по умолчанию.
Я надеюсь, что это поможет вам