В моем кластере Elasticsearch у меня есть индекс со следующими сопоставлениями (и другими тоже, но они выходят за рамки этого вопроса):
{
"mappings": {
"_doc": {
"dynamic": "strict",
"properties": {
"idA": {
"type": "long"
},
"idB": {
"type": "long"
},
"countC": {
"type": "integer"
}
}
}
}
}
Затем мы используем клиент REST высокого уровнячтобы выполнить поисковый запрос с (более или менее) следующими параметрами:
{
"size": 5,
"timeout": "1000ms",
"query": {
"bool": {
"must": [
{
"match_all": {
"boost": 1
}
}
],
"filter": [
{
"bool": {
"must": [
{
"term": {
"idA": {
"value": "this_id",
"boost": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"_source": false,
"docvalue_fields": [
{
"field": "idA"
},
{
"field": "idB"
},
{
"field": "countC"
}
],
"sort": [
{
"_doc": {
"order": "asc"
}
}
]
}
Довольно просто, я просто хотел продемонстрировать, что мы извлекаем три поля значения документа, определенные в отображении индекса.
Перейдя на сторону Java, мы можем довольно легко получить поля значений документа из каждого SearchHit через SearchResponse
(при условии, по крайней мере, один SearchHit):
searchResponse.getHits().getHits()[0].field("idA")
Это гдеКажется, у меня есть проблема. Я ожидал бы, что idA.getValue()
будет long
, основанным на отображениях индекса, но он десериализуется как integer
- и на самом деле каждый long
десериализуется как integer
изто, что я видел до сих пор (хотя я предполагаю, что достаточно большие числа будут десериализованы должным образом).
Если бы я догадался, я бы сказал, что клиент, похоже, выбирает тип поля самостоятельновместо того, чтобы доверять отображению.
До сих пор наш обходной путь заключался в использовании Number#longValue
, Number#intValue
и т. д., чтобы получить желаемый тип, но я бы предпочел доверить клиенту REST высокого уровняуважайте отображение индекса и на самом деле верните мне длинное или целое число.
Я также пытался извлечь эти значения из источника, а не из полей значений документа, но источник имеет то же самоевопрос также.
Я поступаю неправильно?