REST-клиент высокого уровня. Как заставить DocumentFields соблюдать сопоставление номеров индексов? - PullRequest
0 голосов
/ 08 октября 2019

В моем кластере 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 высокого уровняуважайте отображение индекса и на самом деле верните мне длинное или целое число.

Я также пытался извлечь эти значения из источника, а не из полей значений документа, но источник имеет то же самоевопрос также.

Я поступаю неправильно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...