在我的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#longValue
,Number#intValue
等来获取所需的类型,但是我宁愿相信High Level REST Client尊重索引映射和实际上还给我一个长整数或整数。
我还尝试从源而不是从doc值字段中提取这些值,但是源也存在相同的问题。
我会以错误的方式处理吗?