高级REST客户端-如何使DocumentFields遵守索引号映射?

时间:2019-10-08 15:14:23

标签: elasticsearch

在我的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方面,我们可以很容易地通过SearchResponse(假设至少有一个SearchHit)从每个SearchHit中获取doc值字段:

searchResponse.getHits().getHits()[0].field("idA")

这似乎是我遇到的问题。我希望idA.getValue()会是基于索引映射的long,但是会反序列化为integer-实际上,每个 long到目前为止,我正在将其反序列化为integer(尽管我认为可以对足够大的数字进行反序列化。)

如果我要猜测的话,我想说的是客户似乎是自己选择字段的类型,而不是信任映射。

到目前为止,我们的解决方法是使用Number#longValueNumber#intValue等来获取所需的类型,但是我宁愿相信High Level REST Client尊重索引映射和实际上还给我一个长整数或整数。

我还尝试从源而不是从doc值字段中提取这些值,但是源也存在相同的问题。

我会以错误的方式处理吗?

0 个答案:

没有答案